نماد سایت امپراطوری من

آموزش Regex در PHP

regex thumb

در این آموزش می‌خواهیم در مورد 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 استفاده کنید.

موفق و پیروز باشید.

خروج از نسخه موبایل