عبارات منظم RegularExpression
در این قسمت قصدداریم تا با یکی از مباحث پیشرفته یعنی عبارات منظم یا عبارات باقاعده (regular expression) آشنا بشیم. کاربرد عبارت منظم برای تشخیص متن از روی الگوست به طوری که اگر متن با الگو تطابق داشته باشد مقدار یک برمی گرداند و اگر متن با الگو تطابق نداشته باشد مقدار صفر را بر می گرداند. عبارات منظم در برنامه نویسی پیشرفته بسیار کاربرد دارد.
کاربردهای عبارات منظم (regular expression)
- تشخیص عبارت خاص در رشته : فرض کنید شما یک رشته حاوی آدرس یک عکس رو دارید و می خواهید که فرمت تصویر رو تشخیص بدید .
- اعتبار سنجی ایمیل ها در فرم های ثبت نام
- تشخیص امن بودن رمز انتخابی توسط کاربر در فرم های ثبت نام
- موتورهای جستجو گر
- گشت زدن در یک صفحه اینترنتی و پیدا کردن المنت خاص. (بی شباهت به مورد بالا نیست).
ساختار عبارات منظم (regular expression)
ساختار کلی عبارات منظم از دو قسمت pattern و flag تشگیل شده که توسط delimiter از هم جدا می شوند:
متا کاراکتر ها (RegularExpression) در عبارات منظم
ما می تونیم تا کاراکتر های معمولی رو در الگوی خودمون قرار بدیم و همچنین کاراکتر های خاص الگوی (a|b)r
توجه کنید.
این رشته کاراکتر که الگوی ما هست تشکیل شده از دو قسمت :
- قسمت اول کاراکتر های مشخص هستند که باید مستقیما استفاده شده باشند . در اینجا کاراکتر r
- قسمت دوم متا کاراکتر هست که عملیات خاصی رو روی کاراکتر های اطرافش انجام میده . در اینجا کاراکتر | که عملیات OR رو روی کاراکتر های a و b انجام میده.
کاراکتر نقطه .
با هر کاراکتری (به تعداد خودش) غیر از کاراکتر خط جدید مطابقت می کنه.
<?php echo preg_match("/h.t/", "hot"); //1 echo preg_match("/h.t/", "ht"); //0 echo preg_match("/h.t/", "hoppppt"); //0
نکته : اگر منظور شما به طور دقیق کاراکتر نقطه باشد باید قبل از آن \ قرار دهید.
<?php echo preg_match("/h\.t/", "h.t"); //1
کاراکتر پایپ |
این کاراکتر معنی OR رو برای ما داره . این عملیات بین کاراکتر های سمت چپ و راست اتفاق می افته.
<?php echo preg_match("/a|br/", "ar"); //1 echo preg_match("a|br", "br"); //1
کاراکتر بعلاوه +
این کاراکتر با تعداد یک یا بیشتر (از کاراکتر قبل خودش) مطابقت می کنه.
<?php echo preg_match("/he+t/", "heeet");//1 echo preg_match("/he+t/", "het"); //1 echo preg_match("/he+t/", "ht"); //0
کاراکتر ستاره *
با هر تعداد (صفر یا بیشتر) از کاراکتر قبل خودش مطابقت می کنه.
<?php echo preg_match("/ho*t/", "hot"); //1 echo preg_match("/ho*t/", "hoooot");//1 echo preg_match("/ho*t/", "ht"); //1
کاراکتر علامت سوال ?
با حداکثر یک کاراکتر مطابقت (از کاراکتر قبل خودش) مطابقت می کنه (صفر یا یک).
<?php echo preg_match("/ho?t/", "hot"); //1 echo preg_match("/ho?t/", "het"); //0 echo preg_match("/ho?t/", "ht"); //1
کاراکتر آکولاد { }
در داخل آکولاد می تواند تعداد کاراکتر (عبارت قبل از آن) مشخص شود.
<?php echo preg_match("/h{1}t/", "hot"); //0 echo preg_match("/h{2}eet/", "hheet"); //1
- اگر ساختار آکولاد به شکل
{x,}
باشد به معنی تعداد x یا بیشتر خواهد بود.
<?php echo preg_match("/h{1,}t/", "ht"); //1 echo preg_match("/h{2,}t/", "hhhot"); //0 echo preg_match("/h{2,}/", "hhoeeeet");//1
- اگر ساختار آکولاد به شکل
{x,y}
باشد به معنی حداقل x و حداکثر y خواهد بود.
<?php echo preg_match("/h{1,5}t/", "hhht"); //1 echo preg_match("/h{3,4}t/", "hht"); //0
نکته : دقت داشته باشید مواردی که گفته شد ممکنه که قبل از اون یک کاراکتر باشه یا یه الگوی خاص یا گروهی از کاراکتر ها مثلا (a[-z])
این مورد شامل پرانتز و براکت میشه که در ادامه به توضیح اون می پردازیم.
کاراکتر پرانتز ( )
از کاراکتر پرانتز به منظور گروه بندی کاراکتر ها استفاده میشه .
این مورد زمانی معنی پیدا می کنه که از آیتم های قبلی استفاده بشه ، مثلا گروهی از کاراکتر ها یک یا چند بار تکرار بشه.
<?php preg_match("(php){2}","phpphp"); //1 preg_match("php{2}","phpp"); //1
کاراکتر براکت [ ]
در داخل براکت می توان بازه از کاراکتر تعریف کرد.
اگر تعداد آن در بعد تعریف شده باشد (مثلا توسط + یا * یا ? ) باید از آن قانون پیروی کند و اگر تعریف نشده باشد به معنی این که حتما یکی از کاراکتر ها وجود داشته باشد.
<?php echo preg_match("/h[a-z]t/", "hoht"); //0 echo preg_match("/h[hur]t/", "hht"); //1 echo preg_match("/h[hur]t/", "hhut"); //0
- در داخل براکت می توان بازه از کاراکتر ها رو تعریف کرد. این بازه می تونه به صورت از یک کاراکتر تا کاراکتر دیگر تعریف کردکه به صورت زیر تعریف میشود.
[a-d]
که به معنی از کاراکتر a تا کاراکتر d که شامل a,b,c,d می باشد.
[0-5]
که به معنی از عدد 0 تا 5 که شامل 0,1,2,3,4,5 می باشد.
در این مورد ما می توانیم دسته کاراکتری تعریف کنیم که شامل تمامی حروف کوچک و تمامی حروف بزرگ و همچنین تمامی اعداد باشد که بعضی از آن ها اختصار هم دارند
الگو | توضیحات | اختصار |
---|---|---|
[a-z] |
تمامی حروف کوچک | |
[A-Z] |
تمامی حروف بزرگ | |
[0-9] |
تمامی اعداد | \d |
[a-zA-z0-9] |
تمامی حروف کوچک و بزرگ و اعداد | \w |
به مثال های زیر توجه کنید:
<?php echo preg_match("/h[a-z][a-f]t/", "hect"); //1 echo preg_match("/h[a-z][b-f]t/", "hogt"); //0
- متا کاراکتر هایی که تا به الان گفتیم در داخل براکت معنی خود را از دست می دهند . به طور مثال ( + , * , ?).
<?php echo preg_match("/h[ae.z]t/", "het"); //1 echo preg_match("/h[a*bz]t/", "h*t"); //0
کاراکتر ^
بعد از این کاراکتر یک حرف قرار می گیرد که باید رشته با آن شروع شود.
<?php echo preg_match("/^[a-f]/" , "abf"); //1 echo preg_match("/^[a-f]/" , "htabf");//0 echo preg_match("/^[a-f]/" , "uabf"); //0 echo preg_match("/^a[b-z]+/" , "ay"); //1 echo preg_match("/^[a-f]/" , "dabf"); //1
استفاده از ^ در داخل براکت
استفاده از ^ در داخل براکت به معنی متمم مجموعه است ، یعنی هر آنچه که در داخل مجموعه نیست.
<?php echo preg_match("/[^b-z]+/" , "a"); //1 echo preg_match("/[^a-d]+/" , "b"); //0
نکته : اگر بخواهید از خود کاراکتر ^ در داخل براکت استفاده کنید باید قبل از آن \ قرار دهید.
کاراکتر $
قبل از این کاراکتر یک حرف قرار می گیرد که رشته باید با آن تمام شود.
<?php echo preg_match("/[a-f]$/" , "abf"); //1 echo preg_match("/[a-f]$/" , "abfo"); //0 echo preg_match("/\.(png){0,3}$/" , "ali.png"); //1 echo preg_match("/\.(jpg){0,3}$/" , "ali.jpg"); //1 echo preg_match("/[a-f]+s$/" , "abfs"); //1
نکته : اگر بخواهید از خود متا کاراکترها ( + , * , . ) در pattern خودتون استفاده کنید باید قبل از اون ها \ قرار بدید.
flag ها
- i : این فلگ به منظور اعمال pattern به صورت case insetive می باشد.
استفاده از عبارات منظم در PHP
ما برای عملیات مقایسه pattern و string از تابع preg_match()
استفاده می کنیم.
<?php preg_match ( string $pattern , string $matches ); ?>
- pattern : الگوی کامل عبارت باقاعده
- matches : رشته ای که قراره مقایسه در اون انجام بشه.
خروجی این تابع با توجه به این که الگو درست است یا خیر صفر یا یک است .
برای جایگزینی یک رشته از تابع preg_replace
استفاده می کنیم. به طور مثال فرض کنید endpoint های صفحه ها را از انتهای یک لینک برداریم.
$url = "https://example.com/product-category/page/75/" echo preg_replace("/page\/[0-9]/","",$url);
دیدگاهتان را بنویسید