آموزش Regex در PHP 5/5 (5)

1
1302
regex thumb

در این آموزش می‌خواهیم در مورد Regex در PHP صحبت کنیم. در واقع regex ترکیب دو کلمه regular و expression به معنای عبارت با قاعده است. فرض کنید می‌خواهید نشانی ایمیل کاربر را دریافت کنید. می‌دانید تمام آدرس‌های ایمیل یک الگوی مشخص دارند. مثلا تعدادی کاراکتر متنی و عدد، سپس کاراکتر @ و بعد مجدد تعدادی کاراکتر متنی و عدد و بعد کاراکتر نقطه و در انتها مجدد تعدادی کاراکتر متنی

حال اگر بخواهیم این قاعده را بر روی ورودی کاربر اعمال کنیم، باید آن را بصورت یک عبارت با قاعده بنویسیم:


<?php

$pattern = "/^(\w+[_.]?\w+)+(\@)(\w)+(\.)([a-z]){2,6}$/"

$email = "test@myempire.ir";

if(preg_match($pattern, $email){

print "OK";

}else{

print "invalid email address";

}

نمونه کد بالا با استفاده از تابع preg_match محتوای متغیر $email را با الگوی ارائه شده در متغیر $pattern مقایسه می‌کند. در صورتی که $email با الگوی $pattern مطابقت داشته باشد، عبارت OK و در غیر اینصورت عبارت invalid email address نمایش داده خواهد شد. اما چگونه می‌توان regex دلخواه را تولید کرد؟

[divider]

شروع و پایان Regex

اگر برای Regex شروع و پایان تعیین نکنیم، الگوی ما مجاز خواهد بود تا در هر کجای ورودی اتفاق بیافتد. چنانچه نیاز باشد که شروع و پایان ورودی حتما با الگوی ما مطابقت داشته باشد و یا قانون ما بر روی هر خط از ورودی اجرا شود و در این خطوط ابتدا و انتهای هر خط با الگو همخوانی داشته باشد، می توانید از کاراکتر ^برای شروع و از کاراکتر $ برای پایان استفاده کنید. به طور مثال فرض کنید می‌خواهید متن ورودی برابر با yusef باشد. برای این منظور از regex زیر استفاده می‌کنیم:


"/^yusef$/"

قانون در regex

برای تعریف یک قانون کافیست تا محتوای آن قانون را داخل پرانتز قرار دهید. به طور مثال فرض کنید می‌خواهیم ورودی yusefshiri باشد و بتوانیم yusef و shiri را از هم تفکیک کنیم:


"/^(yusef)(shiri)$/"

بازه کاراکتری

برای تعریف بازه از براکت استفاده می‌شود. مثلا [abc] یعنی هر کدام از کاراکترهای a یا b یا c همچنین می‌توان ابتدا و انتهای بازه را وارد نمود. مثلا [a-c] در این حالت تمام کاراکترهای موجود در این بازه قابل قبول خواهند بود. همچنین می‌توان چند بازه را با هم به کار برد. مثلا [a-cg-o] در این مثال کاراکتر‌های مابین a و c و کاراکترهای مابین g تا o مورد قبول خواهند بود.

متن(حروف و عدد)

این قانون تمام کاراکترهای متنی و عددی را قبول میکند. برای استفاده از این قانون کافیست تا عبارت \wرا استفاده کنید. این عبارت شامل بازه [a-zA-Z0-9_] است. همچنین برای قبول کاراکترهای غیر متنی می‌توان از قانون \W استفاده کرد. این قانون درست قرینه‌ی قانون کاراکترهای متنی و عددی است.

تکرار

برای هیچ یا یک بار تکرار از ? برای یک تا بیشمار تکرار + و برای هیچ تا بیشمار از * استفاده کنید. فرض کنید می‌خواهیم متن ورودی در ابتدای خود هیچ یا یک کاراکتر a و سپس یک تا بیشمار کاراکتر b و هیچ تا بیشمار کاراکتر c داشته باشد.


"/^a?b+c*$/"

تعداد تکرار مشخص

زمانی که دقیقا می‌دانیم بخشی از ورودی باید به تعداد مشخص تکرار شود از نماد {x} و زمانی که تکرار بین دو مقدار مشخص باشد، از نماد {x,x} استفاده می‌کنیم.

"/^a{5}$/"
"/^[0-9]{2,6}$/"

در تصویر زیر مثال کاربردی برای regexبالا را مشاهده می‌کنید:
regex repeat

عملگر OR

در برخی مواقع ممکن است بخشی از regex ما چند حالت متفاوت داشته باشد. مثلا برای شماره موبایل، هر کدام از حالت‌های ۰۹۱۲xxxxxxx یا +۹۸۹۱۲xxxxxxx یا ۰۰۹۸۹۱۲xxxxxxx قابل قبول باشد. در این حالت، قانونی می‌نویسیم که میان این چند حالت از عملگر OR با نماد | استفاده می‌کنیم:


"/^(0098|\+98|0)?(9\d{9})$/"

خروجی regex فوق به صورت زیر خواهد بود. همانطور که مشاهده می‌کنید، این الگو قابلیت اعتبارسنجی انواع شماره‌تلفن‌های همراه را دارا می‌باشد.
phone number regex

کاراکترهای خاص

برخی از کاراکترها مانند @ و ? و + و * و… در regex مفاهیم خاصی دارند. اما گاهی اوقات ممکن است نیاز داشته باشید که این کاراکترها را در ورودی از کاربر دریافت کنید. در چنین مواقعی با قرار دادن \ قبل از این کاراکترها، می‌توانید آنها را مانند دیگر کاراکترها در regex استفاده کنید:


"/^(\@|\\|\+|\?|\*|\(|\)|\\)+$/"

به نمونه زیر دقت کنید:
regex special characters

whitespace ها

گاهی ممکن است ورودی شامل کاراکترهای whitespace باشد. این کاراکترها عبارتند از [\r\n\t\f\v ] که نمای ظاهری ندارند اما می‌توانند باقی متن را به خط بعد ببرند یا فاصله در متن ایجاد کنند. برای قبول این کاراکترها از عبارت \s و برای قبول کاراکترهایی بجز whitespace ها از عبارت \S استفاده می‌شود.

"/^\s+$/"

در مثال زیر تعدادی Enter و Tab و Shift+Enter وارد شده است، اما همانطور که مشاهده می‌کنید، این کاراکترها نمای ظاهری ندارند:

whitespace regex

 

کاراکترهای Unicode

در استاندارد Unicode تعداد ۶۵۵۳۶ کاراکتر وجود دارد. به عبارت دیگر برای ذخیره‌ی هر کاراکتر به ۲ بایت فضا نیاز است. در میان این کاراکترها، حروف اکثر زبان‌های دنیا و برخی علائم و نشانه‌ها وجود دارد. نوشتن regex برای برخی از این کاراکترها ممکن است سخت باشد. مثلا برای کاراکتر ی در زبان فارسی و عربی، فضاهایی مجزا وجود دارد. در چنین مواقعی، آدرس کاراکتر مورد نظر در جدول Unicode را داخل regex می‌نویسند. برای این کار از عبارت \x{0000} استفاده می‌کنند. عدد ۰۰۰۰ در مبنای ۱۶ نوشته می‌شود و بیانگر محل کاراکتر در استاندارد Unicode است.

به عنوان مثال، میخواهیم الگویی بنویسیم که تمام کاراکترهای حرفی و عددی زبان فارسی را بپذیرد:


"/^[\x{0600}-\x{06FF}]*$/u"

نمونه اجرایی این regex در تصویر زیر قابل مشاهده است.

php farsi characters regex

در regex فوق، همانطور که مشاهده می‌کنید، در پایان الگو بعد از کاراکتر / از حرف u استفاده شده است. کاراکترهایی که در این بخش قرار می‌گیرند، پرچم یا flag نامیده می‌شوند و هر کدام خواصی را به الگو اضافه می‌کنند. مثلا حرف u برای اجرای الگو در  استاندارد unicode مورد استفاده می‌گیرد. سایر مقادیر مجاز عبارتند از:

php regex flags

در ضمن برای تمرین و تست الگوهای خود می‌توانید از وب سایت https://regex101.com استفاده کنید.

موفق و پیروز باشید.

به این مطلب امتیاز بدهید

یک دیدگاه

ارسال یک پاسخ

لطفا دیدگاه خود را وارد کنید!
لطفا نام خود را در اینجا وارد کنید