تعداد بازدید: 3189

عبارات منظم RegularExpression

در این قسمت قصدداریم تا با یکی از مباحث پیشرفته یعنی عبارات منظم یا عبارات باقاعده (regular expression) آشنا بشیم. کاربرد عبارت منظم برای تشخیص متن از روی الگوست به طوری که اگر متن با الگو تطابق داشته باشد مقدار یک برمی گرداند و اگر متن با الگو تطابق نداشته باشد مقدار صفر را بر می گرداند. عبارات منظم در برنامه نویسی پیشرفته بسیار کاربرد دارد.

کاربردهای عبارات منظم (regular expression)

  • تشخیص عبارت خاص در رشته : فرض کنید شما یک رشته حاوی آدرس یک عکس رو دارید و می خواهید که فرمت تصویر رو تشخیص بدید .
  • اعتبار سنجی ایمیل ها در فرم های ثبت نام
  • تشخیص امن بودن رمز انتخابی توسط کاربر در فرم های ثبت نام
  • موتورهای جستجو گر
  • گشت زدن در یک صفحه اینترنتی و پیدا کردن المنت خاص. (بی شباهت به مورد بالا نیست).

ساختار عبارات منظم (regular expression)

ساختار کلی عبارات منظم از دو قسمت pattern و flag تشگیل شده که توسط delimiter از هم جدا می شوند:

regex = ‘/pattern/flag’

متا کاراکتر ها (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);

 

مطالب مشابه

امنیت و رمزنگاری در پی اچ پی

امنیت و رمزنگاری در php

امنیت و رمز نگاری دو مبحث مهم در برنامه ها به شمار میره. به طور کلی ما باید برای حفاظت باید برنامه هامون در برابر حملات...

آرایه ها در php

در این مقاله قصد داریم تا آرایه ها رو در php بررسی کنیم و همچنین توابع مرتبط با آرایه ها رو بررسی کنیم. انواع آرایه در...

رابط mysqli , pdo

رابط mysqli و PDO

عموما DBMS ها یک رابط Command line برای دستکاری پایگاه داده در اختیار کاربر قرار می دهند. همانند تمامی پروتکل های...

معماری های MVC/HMVC

معماری MVC یک قالب برای پیاده سازی رفتار نرم افزار می باشد که بر پایه Model و Controller و View می باشد. controller...

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای عبارات منظم RegularExpression

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *