• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
شاخ regular expression را در دو ساعت بشکنید!
#1
سلام،
همیشه دوست داشتم با عبارات باقاعده/منظم آشنا بشم و بتونم خودم تشخیص بدم و بنویسم. هیچوقت نتونستم تا اینکه دیروز (20 اردیبهشت 90) زدم به سیم آخر و نشستم چند ساعت با عبارات باقاعده ساده کلنجار رفتم. دو تا منبع داشتم و اونا رو می خوندم و هرطور که امکان پذیر بود هی و هی خودم امتحان می کردم و همه رو یکی می کردم و جدا می ساختم و برای خودم تفسیر می کردم تا اینکه بالاخره تونستم هرچی میخوام بنویسم البته الان فهمیدم این زبان خیلی شیرینه (برای خودم) و واقعاً نیازه که یه برنامه نویس حتماً بدونه اون رو چون خیلی جاها بکار میاد. مثلاً خودم یه چیزایی تو ذهنم بود برای برنامه ام که نمیدونستم چطوری به موتور PHP بگم (البته شدنش که می شد ولی دردسر داشت خفن!) ولی الان می بینم با این عبارات خیلی راحتتر می تونم اونارو انجام بدم. ... پیشنهاد می کنم این تاپیک رو دنبال کنید اگر مایلید که بیشتر یاد بگیرید.
در این تاپیک می خوام با کمک خودتون یه منبع خیلی خوب در ایران پی اچ پی درست کنم که فقط به عبارات باقاعده بپردازه. خودم اول شروع می کنم.

؟ : نشون دهنده اینه که عبارت قبلش می تونه در رشته یکبار ظاهر شده باشه یا اصلاً ظاهر نشده باشه
$
کد پی‌اچ‌پی:
str ‘Alireza AliReza AlirReza AliRreza Alieza’
preg_match_all
/Ali[r|R]?eza/$str$match );
print_r$match );
//Khoroji
array(1) { [0]=> array(3) { [0]=> string(7"Alireza" [1]=> string(7"AliReza" [2]=> string(6"Alieza" } } 

* : نشون دهنده اینه که حداقل یک بار ظاهر بشه یا اصلاً ظاهر نشه
کد پی‌اچ‌پی:
$str ‘Alireza AliReza AlirReza AliRreza Alieza’
preg_match_all
/Ali[r|R]*eza/$str$match );
print_r$match );
//Khoroji
Array ( [0] => Array ( [0] => Alireza [1] => AliReza [2] => AliRRRreza [3] => AlirReza [4] => Alieza ) ) 

+ : در رشته می گرده دنبال اون عبارت قبل از خودش که دست کم یکبار ظاهر شده باشه و تعداد تکرار اون عبارت مهم نیست
کد پی‌اچ‌پی:
$str ‘Alireza AliReza AlirReza AliRreza Alieza’
preg_match_all
/Ali[r|R]*eza/$str$match );
print_r$match );
//Khoroji
Array ( [0] => Array ( [0] => Alireza [1] => AliReza [2] => AliRRRreza [3] => AlirReza ) ) 

| : یک عملگر به معنی "یا" هست.
. : یک کاراکتر از هر نوع رو مشخص می کنه.
^ : دو تا جا براش وجود داره. اگر در اول بیاد یعنی داخل کروشه (] و [) نباشه ، یعنی در اول رشته مون باید عبارت بعد از اون ظاهر شده باشه. جای دیگه ، داخل همون کروشه هست که به معنی اینه که هر عبارت که بعد از اون اومد نباید داخل رشته مون باشه.
$ : نشون دهنده اینه که عبارت قبل از اون باید در آخر رشته ظاهر شده باشه.
{num} : یه چیزی شبیه + و ؟ و * هست اما محدودیت داره. یعنی هر عدد صحیحی که بین آکولاد باشه تعداد تکرار عبارت قبل از اون رو نشون میده.
{m,n} : باز هم مثل قبلی برای عمل تکرار ازش استفاده میشه با این تفاوت که حداقل (m) و حداکثر (n) بار میشه برای عبارت قبل از خودش تعریف کرد.
[] : یک کلاس رو مشخص می کنه. به نوعی دست آدم رو هم باز نگه میداره و هم می بنده. مثلاً [a-z] یعنی فقط حروف a تا z مجازن که اینجا محدود کردیم ولی در جای دیگه میگیم Al[i|I]reza که خروجی می تونه Alireza و AlIreza باشه و اینجا دستمون بازه.
- : تا اونجا که من دیدم بیشتر به معنی "تا" هست. مثلاً [0-9] یعنی 0 تا (الی) 9
\ : بهش میگن گریز یا escaping چون ازش زمانی استفاده می شه که بخوایم یه دستور رو خنثی کنیم. البته همه جا کاربرد نداره. فرض کن میخوای توی رشته همه اونایی که با هر کارکتر شروع میشه رو پیدا کنی ، خب الگوت میشه ^. اما حالا میخوای همه اونایی رو پیدا کنی که با نقطه شروع میشه الآن الگوت میشه ^\.
() : پرانتز ها یک واحد رو مشخص می کنن. شاید بهتره بگم یه ساختمان که با ساختمان کناریش کاری نداره و اگر اتفاقی بیافته داخل همون ساختمان اتفاق میافته.

دسته استاندارد کاراکتر های POSIX
[:punct:] : همه نشانه ها مثل نقطه و علامت سوال و غیره رو فقط مشخص می کنه.
[:upper:] : کارش اینه که فقط حروفی که بزرگ نوشته شدن رو تشخیص میده.


دستورات بالا خیلی بکار میان ولی یکسری متاتگ هست که از پیش تعریف شده برای راحتی کار ما که با یک “\” شروع میشه و در زیر براتون می نویسم.
\s : هر نوع کاراکتر فاصله رو مشخص می کنه.
\S : به معنی هر کاراکتری (فارسی و غیر فارسی فرقی نمی کنه) بجز فاصله هست.
\d : اعداد دسیمال رو تشخیص میده.
\D : اعداد غیر دسیمال رو مشخص می کنه.
\uXXXX : یک کاراکتر یونیکد که XXXX کد کاراکتر یونیکد هست رو مشخص می کنه.



توجه کنید خوشگلا: به مرور زمان قول میدم این تاپیک اگر ازش استقبال بشه هم اشتباهتشو بر طرف کنیم و هم مثال های بیشتری براتون بزنیم Heart [قول مردونه]
غایب
  پاسخ
تشکر شده توسط : zoghal mojtabadj parvane paull oia Padideh mghhgm majid1605


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان