در این آموزش میخواهیم در مورد 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بالا را مشاهده میکنید:
عملگر OR
در برخی مواقع ممکن است بخشی از regex ما چند حالت متفاوت داشته باشد. مثلا برای شماره موبایل، هر کدام از حالتهای ۰۹۱۲xxxxxxx یا +۹۸۹۱۲xxxxxxx یا ۰۰۹۸۹۱۲xxxxxxx قابل قبول باشد. در این حالت، قانونی مینویسیم که میان این چند حالت از عملگر OR با نماد | استفاده میکنیم:
"/^(0098|\+98|0)?(9\d{9})$/"
خروجی regex فوق به صورت زیر خواهد بود. همانطور که مشاهده میکنید، این الگو قابلیت اعتبارسنجی انواع شمارهتلفنهای همراه را دارا میباشد.
کاراکترهای خاص
برخی از کاراکترها مانند @ و ? و + و * و… در regex مفاهیم خاصی دارند. اما گاهی اوقات ممکن است نیاز داشته باشید که این کاراکترها را در ورودی از کاربر دریافت کنید. در چنین مواقعی با قرار دادن \ قبل از این کاراکترها، میتوانید آنها را مانند دیگر کاراکترها در regex استفاده کنید:
"/^(\@|\\|\+|\?|\*|\(|\)|\\)+$/"
به نمونه زیر دقت کنید:
whitespace ها
گاهی ممکن است ورودی شامل کاراکترهای whitespace باشد. این کاراکترها عبارتند از [\r\n\t\f\v ] که نمای ظاهری ندارند اما میتوانند باقی متن را به خط بعد ببرند یا فاصله در متن ایجاد کنند. برای قبول این کاراکترها از عبارت \s و برای قبول کاراکترهایی بجز whitespace ها از عبارت \S استفاده میشود.
"/^\s+$/"
در مثال زیر تعدادی Enter و Tab و Shift+Enter وارد شده است، اما همانطور که مشاهده میکنید، این کاراکترها نمای ظاهری ندارند:
کاراکترهای Unicode
در استاندارد Unicode تعداد ۶۵۵۳۶ کاراکتر وجود دارد. به عبارت دیگر برای ذخیرهی هر کاراکتر به ۲ بایت فضا نیاز است. در میان این کاراکترها، حروف اکثر زبانهای دنیا و برخی علائم و نشانهها وجود دارد. نوشتن regex برای برخی از این کاراکترها ممکن است سخت باشد. مثلا برای کاراکتر ی در زبان فارسی و عربی، فضاهایی مجزا وجود دارد. در چنین مواقعی، آدرس کاراکتر مورد نظر در جدول Unicode را داخل regex مینویسند. برای این کار از عبارت \x{0000} استفاده میکنند. عدد ۰۰۰۰ در مبنای ۱۶ نوشته میشود و بیانگر محل کاراکتر در استاندارد Unicode است.
به عنوان مثال، میخواهیم الگویی بنویسیم که تمام کاراکترهای حرفی و عددی زبان فارسی را بپذیرد:
"/^[\x{0600}-\x{06FF}]*$/u"
نمونه اجرایی این regex در تصویر زیر قابل مشاهده است.
در regex فوق، همانطور که مشاهده میکنید، در پایان الگو بعد از کاراکتر / از حرف u استفاده شده است. کاراکترهایی که در این بخش قرار میگیرند، پرچم یا flag نامیده میشوند و هر کدام خواصی را به الگو اضافه میکنند. مثلا حرف u برای اجرای الگو در استاندارد unicode مورد استفاده میگیرد. سایر مقادیر مجاز عبارتند از:
در ضمن برای تمرین و تست الگوهای خود میتوانید از وب سایت https://regex101.com استفاده کنید.
موفق و پیروز باشید.
از آموزش خوبتون ممنون خیلی مفید و آموزنده بود برای من