regex-tutorial

آموزش regular expressions – اصول پایه

عبارات با قاعده یا regex (مخفف Regular expression) دستوراتی هستند که با استفاده از اونا میتونید به جستجوی یک زیرمتن (زیر رشته) در یک متن دیگه بپردازید. در این سری آموزش از اموزش های regex (کلیک کنید) سعی میکنم عبارات با قاعده در PHP رو به شما دوستان عزیز به صورت عملی اموزش بدم.

برای استفاده از Regex در PHP شما باید مراحل زیر رو طی کنید:

  1. نوشتن یک Regex با توجه به نیاز خودتون (در ادامه اصول پایه رو بهتون یاد میدم)
  2. اجرای Regex نوشته شده توسط توابعی که در PHP در نظر گرفته شدن (در ادامه میگم)

دوستان عزیز در اینجا اصول پایه برای نوشتن عبارات با قاعده رو توضیح میدم اما در پست های بعدی به اموزش مباحث بیشتری میپردازیم.

برای نوشتن regex یک سری حروف و علامت هایی(الگوها) وجود داره که باید اونا رو یاد داشته باشید. این علامت ها هر کدوم با رشته(متن) یا کلمه یا حروف الفبا و یا اعداد مطالبقت میکنه! مثلا شما برای اینکه بررسی کنید توی متن شما عدد هست یا نه میتونید از d\ استفاده کنید. یک سری از این علامت ها(الگوها) به صورت زیر هستند:

  1. علامت ^ : این علامت به ابتدای رشته (متن) اشاره میکنه و اگه این علامت رو استفاده کنید یعنی اینکه اول متن باید با علامتی که بعد از ^ قرار گرفته مطابقت داشته باشه.
  2. علامت $ : این علامت به انتهای رشته (متن) اشاره میکنه بدین صورت که اگه از این علامت استفاده کنید یعنی علامتی که قبل از $ قرار گرفته باید با انتهای متن مطابقت کنه.
  3. علامت [] : یک کلاس کاراکتر ایجاد میکند (گروه کاراکتر) کاراکترها و علامت هایی که درون [] قرار بگیرن به عنوان یک کلاس در نظر گرفته میشن.
  4. علامت ^ درون [] : این علامت کلاس کاراکتر را نات میکند(not) مثل not منطقی توی همه ی زبان های برنامه نویسی.
  5. علامت () : یک گروه کاراکتر ایجاد میکند , کاراکترهایی که درون () قرار بگیرن به عنوان یک گروه کاراکتر در نظر گرفته میشن.
  6. علامت | : برای or کردن استفاده میشه , مثلا میتونید چندتا عبارات با قاعده رو با هم or کنید. (or به معنی یا است).
  7. علامت + : به معنای تکرار یک تا بیشمار است (حداقل یک تکرار و حداکثر بی شمار تکرار) , کاراکتری که قبل از + قرار بگیره با تعداد یک یا بیشمار از همان کاراکتر مطابقت میکنه.
  8. علامت * : به معنای تکرار صفر تا بی شمار است (حداقل صفر تکرار و حداکثر بی شمار تکرار) , کاراکتری که قبل از * قرار بگیره با تعداد یک یا بیشمار از همان کاراکتر مطابقت میکنه.
  9. علامت {} : برای ایجاد شمارنده استفاده میشه. دوتا مقدار میتونه بگیره که یکی حداقل تعداد و یکی حداکثر تعداد رو مشخص میکنه و این دو مقدار با ویرگول از هم جدا میشن مثلا به صورت {۵,۱۵} که به معنای تکرار ۵ تا ۱۵ است! کاراکتر یا علامتی که قبل از {} قرار بگیره به تعدادی که مشخص کردیم تکرار خواهد شد. اگه عدد دوم رو وارد نکنید مثلا {,۵} به معنای تکرار حداقل ۵ تا بی نهایت است. (عدد دوم رو میشه نذاشت تا حالت تکرار بی نهایت ایجاد بشه ولی عدد اول رو حتما باید درج کرد).
  10. علامت \ : به عنوان کاراکتر فرار استفاده میشه مثلا اگه بخواید خود علامت ^ رو درون متن جستوجو کنید در حالت عادی امکانش نیست چون ^ جزو دستورات Regex در نظر گرفته میشه! اما میشه از ^\ استفاده کرد(ترکیب \ و ^) , که باعث میشه کاراکتر ^ به عنوان دستورات Regex در نظر گرفته نشه و توی متن جستوجو بشه.
  11. علامت . : (نقطه) این علامت با یک کاراکتر (عددی و متنی) تطبیق میکنه مثلا a.b میتونه هر کلمه ی ۳ حرفی باشه که بین حرف a و b میتونه عدد یا کاراکتر انگلیسی دیگه قرار بگیره. مثلا acb یا a9b یا a0b یا akb یا …
  12. علامت w\ : (دبلیو کوچیک) به این علامت کلاس کاراکتری گفته میشه و به حروف انگلیسی a تا z (بزرگ و کوچک) و اعداد و حرف _ اشاره میکنه.
  13. علامت W\ : (دبلیو بزرگ) به این علامت کلاس غیر کاراکتری گفته میشه (دقیقا برعکس مورد قبلی) که به هرچیزی غیر از حروف انگلیسی و اعداد و حرف _ اشاره میکنه.
  14. علامت d\ : به این علامت کلاس عددی گفته میشه که به اعداد ۰ تا ۹ اشاره میکنه
  15. علامت D\ : به این علامت کلاس غیر عددی گفته میشه که به هرچیزی غیر عددی اشاره میکنه.

ابتدا برای هرکدوم از قواعد بالا یک مثال میزنم و بعدش به دستورات PHP مورد نیاز میپردازیم. (علامت ها و قواعد در مبحث regex زیاده که در اموزش های بعدی بهش میپردازیم)

مثال برای علامت ^ : این علامت همونطور که گفتیم به ابتدای متن اشاره میکنه. فرض کنید یه عدد داریم مثلا شماره موبایل و میخوایم بررسی کنیم شماره موبایل هست یا نه؟ یکی از شرط ها دارا بودن عدد ۰۹ در ابتدای شماره های موبایل هست(ایرانسل و همراه اول) که میتونیم با regex به صورت زیر بررسی کنیم:

مثال بالا به هر رشته ای که با ۰۹ شروع شده باشه اشاره میکنه میتونید regex بالا رو اینجا تست کنید(کلیک کنید)

مثال برای علامت * : این علامت به معنای تکرار صفر یا بیشمار است! که به صورت زیر میتونیم ازش استفاده کنیم

در مثال بالا تکرار عدد ۵ در صورتی که تکرار بین صفر تا بی نهایت داشته باشه انتخاب میشه 😀 به همین راحتی.

مثال برای علامت []: این علامت یه کلاس کاراکتری ایجاد میکنه. میتونید باهاش بازه های کاراکتری ایجاد کنید کافیه از یه خط تیره استفاده بشه. به مثال زیر دقت

مثال بالا با هر رشته ای که حروف بزرگ انگلیسی توش تکراری بین یک تا بی نهایت داشته باشن مطابقت میکنه , با استفاده از خط تیره توی مثال بالا ما یه بازه ایا range ایجاد کردیم. مثلا میتونید اینجا رو ببیند

اگه بخواید regex با یه تعداد کاراکتر مورد نظر تطابق کنه میتونید از کلاس استفاده کنید کافیه که اون کاراکتر ها رو پشت سر هم ذکر کنید به مثال زیر دقت کنید:

در مثال بالا اگه حروف m یا k یا t یا l بین صفر تا بی نهایت تکرار بشن مورد تطبیق قرار میگیرن.

مثال برای علامت ^ درون []: این علامت وقتی که بیرون از [] استفاده بشه به تطبیق در ابتدای رشته اشاره میکنه اما وقتی که درون [] استفاده بشه همه چیز رو منفی یا not میکنه. به مثال زیر دقت کنید:

مثال بالا همه ی رشته (متن) هایی که توش اعداد از ۵ تا ۸ (۸ و ۷ و ۶ و ۵) نباشه رو تطبیق میده.

مثال برای علامت (): یه گروه کاراکتری رو مشخص میکنه! مثلا اگه بخواید توی یه متن همه ی مکان هایی که کلمه he توش تکرار شده رو پیدا کنید میتونید به صورت زیر عمل کنید:

در مثال بالا هرجا کل کلمه ی he تکرار شده باشه مورد تطبیق قرار میگیره! تفاوت بین کلاس کاراکتری و گروه کاراکتری در این هست که کلاس کاراکتری هر کاراکتر رو به صورت جداگانه در نظر میگیره ولی گروه کل کاراکتر ها رو باهم در نظر میگیره.

مثال برای علامت |: این دستور برای or کردن چندتا شرط استفاده میشه , مثلا به دستورات زیر دقت کنید:

در مثال بالا از هرجا که رشته با a یا b یا k ادامه پیدا کنه انتخاب میشه. نتیجه رو میتونید از اینجا ببینید

مثال برای علامت {}: این علامت برای ایجاد شمارنده به کار میره به مثال زیر دقت کنید:

مثال بالا تمام رشته هایی که توش حروف کاراکتری (کاراکتر انگلیسی , اعداد و _) باشه و طول انها بین ۴ تا ۸ باشه رو انتخاب میکنه , میتونید نتیجه رو از اینجا ببینید(کلیک کنید).

مثال برای علامت \: این علامت به عنوان کاراکتر فرار به کار میره مثلا میخوایم تمامی کاراکتر های ^ و $ رو درون متن انتخاب کنیم به صورت زیر عمل میکنیم:

نتیجه ی مثال بالا رو میتونید از اینجا(کلیک کنید) ببینید

مثال برای علامت .: این علامت رو میشه به جای کاراکتر های دیگه به کار برد. هرجا نمیدونستید چه کاراکتری میاد و میخواید یه جا نگهدار به جای اون کاراکتر بزارید از نقطه (.) استفاده کنید. به مثال زیر دقت کنید:

مثال بالا با رشته های سه حرفی مطابقت میکنه مثلا axz یا a9z یا هرچیز دیگه ای که به جای نقطه میتونه اعداد و حروف انگلیسی باشه.

برای بقیه علامت ها مثال نمیزنم ولی میتونید خودتون اونا رو توی رج اکسر(regexr.com) تست کنید.

دستورات PHP برای اجرای regex :

در PHP دستوراتی برای اجرا و استفاده از regex وجود داره لیست پرکاربرد ترین توابع برای کار با Regex در PHP به صورت زیر هستند:

  • preg_match : این تابع یک متن و یک Regex رو میگیره و با استفاده از regex درون این متن جستوجو میکنه! اولین تطابق که پیدا بشه رو درون یه متغیر میریزه. به صورت زیر استفاده میشه:

همونطور که در بالا نوشتم تابع preg_match سه تا مقدار متغییر میگیره. اولی regex ما خواهد بود. دومین ورودی رشته ای خواهد بود که میخوایم جستوجو درون اون انجام بشه و سومین متغیر برای موقعی استفاده میشه که اگه تطبیقی وجود داشت درون اون ریخته بشه. همچنین متغیر has_matches رو برای این گذاشتم که اگه تطبیقی وجود داشت مقدار ۱ درون has_matches ریخته بشه و بتونم بررسی کنم تطبیقی وجود داشته یا نه , نمونه مثالی که میتونیم بزنیم به صورت زیر است:

توی مثال بالا اگه تطبیقی وجود داشته باشه توی صفحه میگیم که یه چیزی پیدا شد(found match) و ذر غیر این صورت میگیم regex نتونست چیزی پیدا کنه (regex pattern does not match).

  • preg_match_all : این تابع مثل تابع قبلی کار میکنه با این تفاوت که همه ی تطابق ها رو به صورت ارایه درون متغیر میریزه و به ما میده و همچنین در صورتی که تطبیقی وجود داشته باشه مقدار ۱ رو برمیگردونه و در غیر این صورت مقدار ۰ رو برمیگردونه.

در مثال بالا ابتدا با Regex درون متن جستوجو میکنیم (با تابع preg_match_all) و سپس نتایج یافت شده رو نشون میدیم 😀 به همین راحتی.

  • preg_replace : این تابع با استفاده از regex درون متن مورد نظر میگرده و اگه تطابقی پیدا شد اون رو با متن دیگه ای که میدیم تعویض میکنه , به مثال زیر دقت کنید:

تابع preg_replace همونطور که در مثال بالا میبینید سه تا مقدار میگیره. مقدار اول regex ما خواهد بود. مقدار دوم رشته ی جایگزین (رشته ای که قراره به جای رشته ی تطابق شده قرار بگیره) و مقدار سوم رشته ی اصلی ما خواهد بود که با استفاده از Regex درون اون جست و جو میشه.

دوستان عزیز این اموزش فقط برای اشنایی با Regex و نحوه ای استفاده از اون در PHP بود. مباحث کاملتر و دسته بندی شده و بهتری در این مورد به زودی قرار میدم که بعد از قرار داده شدن میتونید اونا رو از اینجا(کلیک کنید) بببینید.

کسانی که سوال یا مشکلی دارند از طریق فرم زیر مطرح کنند تا پاسخ بدم. موفق و پیروز باشید.

به اشتراک بگذارید:Email this to someoneShare on FacebookTweet about this on TwitterShare on Google+Digg thisShare on LinkedInPin on PinterestShare on StumbleUponFlattr the authorShare on RedditBuffer this pageShare on TumblrPrint this pageShare on YummlyShare on VK

می‌خواهید دیدگاهتان را بیان کنید؟