درس سیزدهم- عبارات منظم Regular Expression
مقدمه
در دو
درس قبلی با چند نوع برای بررسی دادههای ارسال شده توسط کاربران آشنا
شدیم. یاد گرفتیم که باید همیشه این دادهها را بررسی کرد و بدون بررسی
دقیق آنها اجازه وارد شدن به پایگاه صادر نکنیم. در این درس با مبحث
تازهای به نام عبارت منظم آشنا میشویم.
عبارات منظم
عبارات منظم یک تکنیک است که توسط آن میشود یک متن را بر اساس الگوی
دلخواه بررسی کرد. شیوه کار آن این است که ما ابتدا یک الگو تعریف میکنیم و
بعد دادهها را بر اساس آن الگو ارزیابی میکنیم. یعنی با توجه به الگوی
تعریف شده٬ ماهیت داده را جستجو کرده و اگر همخوانی داشت مهر تایید به آن
میزنیم. به زبان سادهتر میشود٬ جستجوی یک متن برای اینکه ببینیم آیا با
الگوی تعریف شده ما میخواند یا نه؟ اجازه بدهید با یک مثال این مقوله را
بهتر بیان کنیم. فرض کنید که میخواهید ببینید که آیا درون کلمات ورودی حرف
b وجود دارد یا نه. برای این کار یک الگو میسازیم که کلمههای ورودی را با الگوی ما مقایسه کند و در صورت برابری (وجود b در متن مورد نظر) خروجی «۱» به معنی مثبت بدهد.
ساخت یک عبارت منظم٬ ساختار منحصر به فرد خود را دارد٬ این یعنی باید از یک سری قوانین مشخص پیروی کنیم. اما پیاده سازی عبارت منظم در پیاچپی توسط توابعی صورت میگیرد. تابعی که ما از آ> بیشتر استفاده میکنیم تابعpreg_matvh() است.
Preg_match ( الگو , داده ) ;
Preg_match ( ‘/b/’ , ‘babak’ );
همانطور که در مثال بالا گفته شد٬ یک عبارت منظم نوشته شده است تا وجود حرف b را در مقادیر وارد شده بررسی کند (که در اینجا ‘babak’ است).
الگویی که برای بررسی میسازیم باید در بین علامت نقل قول قرار گیرد یا همان " " خودمان. ابتداییترین و آخرین حرف این الگو هم نشانه آغاز و پایان بارت هستند که به آنها نشانه میگوییم. این نشانه میتواند هر کاراکتری باشد٬ اما باید کاراکتری باشد که شما در داخل عبارت استفاده نمیکنید. یعنی اگر قرار است در داخل مقدار ورودی دنبال علامت سوال ؟ بگردید٬ نباید از این علامت برای آغاز و پایان الگو استفاده کنید. در مثال بالا ما از / استفاده کردیم٬ میتوان از کاراکترهایی مثل ! یا | هم استفاده کرد. باز این بستگی به کاربرد الگو دارد.
قسمتهای تشکیل دهنده الگو در عبارات منظم
- نشانه یا آغاز و پایان الگو Delimiter
همانطور
که قبلا هم گفتیم باید از یک کاراکتر یکسان (یکی در آغاز و یکی در پایان)
برای مشخص کردن شروع و پایان الگو استفاده کنیم. کاراکترهایی مانند/, |, ? یا # بسته به اینکه اگر در داخل متن ورودی دنبال آنها نگردیم٬ انتخاب خوبی هستند.
- لفظها Literal
لفظها در اصل همان حروف یا کاراکترهایی هستند که ما در داخل متن دنبال آنها هستیم٬ بطور مثال اگر میخواهید وجودasd را داخل متنی جستجو کنید٬asd همان لفظ شما است.
- کاراکترهای ویژه Metacharacter
کاراکترهای
ویژه٬ کاراکترهایی هستند که ما در داخل متن در جستجوی آنها نیستیم و آنها
برای ما معنی ویژهای دارند٬ بطور مثال علامت ^ یا. یا علامتهای ( ) از
این کاراکترهای ویژه هستند. مثلن علامت "." با هر کاراکتری برابری میکند.
وقتی در الگو از "." استفاده میکنیم٬ این یعنی در جای "." هر کاراکتری
میتواند باشد٬a یا c ـ یا هر کاراکتر دیگر. علامت ^ هم یعنی آغاز الگوی متنی ما. بطور مثال^a یعنی هر متنی که باa آغاز شود. در زیر فهرستی از چند کاراکترهای ویژه با معنی آنها میآوریم:
^: آغاز رشته مورد نظر را بیان میکند که در الگو استفاده میشود.
$: پایان رشته مورد استفاده در الگو
. : هر کاراکتر تنهایی
| : انتخاب بین دو واژه٬ بطور مثال a | S یعنی یا a یا s
[]: این دو کاراکتر آغاز و پایان یک مجموعه یا لیست از موارد مورد استفاده در الگو را بیان میکنند٬ که به آن کلاس میگوییم.
؟ : معنی صفر یا یک کاراکتر را میدهد.
* : معنی صفر کاراکتر یا بیشتر
+: یک کاراکتر یا بیشتر
{}: شروع و پایان یک محدوده برای جستجو را تعیین میکنند. مثلا{x,y} یعنی که ازx تا y را جستجو کن. فرض کنید که میخواهیم از a d را جستجو کنیم٬ پس میشود. {a , d } .
متن مورد هدف Target String
در اصل همان متنی است که ما آن را جستجو میکنیم٬ یعنی متنی که وارد میشود و ما آن را نسبت به الگویمان بررسی میکنیم.
عبارات جستجو Search Expression
عبارتی که ما به عنوان الگو میسازیم و میخواهیم آن را در متنها جستجو کنیم. به آنها عبارات منظم هم میگوییم.
دنباله فرار Escape Sequence
اگر بخواهیم از یکی از کاراکترهای ویژه به عنوان لفظی استفاده کنیم٬ باید آن را شامل دنباله فرار کنیم. این کار را با گذاشتن یک “” قبل از کاراکتر انجام میدهیم. بطور مثال فرض کنید میخواهیم دنبال(a) در داخل متنی بگردیم٬ برای این کار باید قبل از این دو کاراکتر ویژه "()" علامت قرار دهیم٬ که میشود: (a)
کاراکترهای اصلاح کننده Modifiers
این کاراکترها که در آخر الگو و بعد از نشانگر پایان الگو استفاده
میشوند٬ برای اصلاح و یا سادهتر کردن الگو بکار میروند. معروفترین این
کاراکترها٬ کاراکترi است. این کاراکتر اجازه
میدهد که حالت حساسیت به بزرگی یا کوچکی در حروف از بین برود. در ادامه٬
در مثالی بیشتر با این کاراکتر آشنا میشویم.
ساخت عبارات منظم
از آنجا که بهترین راه یادگیری هر چیزی استفاده از آن است٬ ما با ساختن
نمونههایی از عبارات منظم٬ فراگیری آنها را در مثالها آسانتر میکنیم.
مثال ۱: [0-9]
این
یک کلاس را به عنوان الگو تعریف میکند که هر شمارهای در آن قابل جستجو
است. برای داشتن یک عدد پنج رقمی به شکل زیر عمل میکنیم.
$value = $_POST[‘age’];
Preg_match ( ‘!^[0-9]{5}$!’ , $value ) ;
این عبارت را میتوان به شکل دیگری نوشت٬ اساسا شش الگوی کلاسی وجود دارند که دارای معدل هستند. بطور مثال الگوی بالا معادلی مانند زیر دارد:
Preg_match ( ‘!^d{5}$!’ , $value ) ;
حال فرض کنید میخواهیم یک عدد با صفر یا رقم بیشتر داشته باشیم:
Preg_match ( ‘!^[0-9]*!’ , $value ) ;
وجود علامت * رقم عدد را از صفریا بیشتر حساب میآورد.
حال فرض کنید میخواهیم یک رشتهای را که با یک عدد پنج رقمی آغاز و با یک عدد سه رقمی پیایان یابد:
Preg_match ( ‘!^(d{5})(d{3})$!’ , $value ) ;
این الگو از دو قسمت که در داخل پرانتز تعریف شدهاند تشکیل شده است. قسمت ابتدایی که با علامت^ (نشان آغاز رشته) مشخص است٬ یک عدد پنج رقمی را جستجو میکند و قسمت دوم که در انتهای رشته باید جستجو شود با علامت $ (علامت پایان رشته) تعریف شده است.
مثال ۲: [a-z]
این کلاس الگو شامل تمام کلمات با حروف کوچک میشود.
Preg_match ( ‘/^[a-z]/’, $value ) ;
مثال ۳: (sh)
از پرانتز برای داشتن یک ترکیب استفاده میکنیم٬ بطور مثال:
Preg_match ( ‘/^(sh)+/’, $value ) ;
این الگو رشتهای را در نظر دارد از ترکیبsh که حداقل (بخاطر وجود +)٬ ترکیبsh یکبار در آن استفاده شده است.
مثال ۴: [0-9a-zA-Z]
کلاس بالا تمام حروف و اعداد چه بزرگ و چه کوچک را در بر میگیرد.
Preg_match ( ‘#^[0-9a-zA-Z]#’, $value ) ;
مثال ۵: الگوی نام
اجازه بدهید که از اینجا به بعد چند مثال حرفهای که شما بتوانید در سیستم ساخته شده بکار گیرید٬ استفاده کنیم.
فرض کنید که میخواهید ترکیب نام کاربران در حال ثبت نام را با الگوی خود مشخص کنید. در این الگو٬ نام میتواند از حروف کوچک یا بزرگ با تعداد حرف حداقل ۳ و حداکثر ۱۵ تشکیل شده باشد:
$name = $_POST[‘name’] ;
Preg_match ( ‘ /^[a-zA-Z]{3,15}$/’ , $name ) ;
نکتهای که در اینجا میتوان اشاره کرد٬ جلوگیری از تکرار حروف است٬ یعنی بجای اینکه هر بار بگوییم حروف کوچک و حروف بزرگ٬ با یک تکنیک هر دو صورت را در نظر میگیریم:
$name = $_POST[‘nam’] ;
Preg_match ( ‘ /^[a-z]{3,15}$/i’ , $name ) ;
همانطور که در الگوی تازه میبینید٬ یکی از سری حروف الفبا را حذف کردهایم و بجای آن در آخر الگو از علامت I استفاده کردهایم.
مثال ۶: الگوی پسورد
برای درست کردن یک الگوی پسورد به شکل زیر عمل میکنیم:
$password = $_POST[‘password’] ;
Preg_match ( ‘ /^w{5,20}$/’ , $password ) ;
این الگو برای پسورد به شکل استفاده از معادل کلاس برای تمام حروف و اعداد ساخته شده است. یعنی تمام حروف و اعداد به علاوه ـ. در ادامه بیشتر معدلها را بررسی خواهیم کرد.
نکته: این طور نیست که شما نیاز به حفظ کردن تمام این کاراکترها و الگوها داشته باشید. کافیست که فقط با آنها آشنایی لازم را پیدا کرده و بعد از روی یک منبع درست٬ اقدام به ساختن الگو خود کنید. به علاوه٬ ساختن الگو برای هر رشتهای میتواند به صورتهای مختلف انجام گیرد٬ پس نیازی به داشتن یک الگو به عنوان تک نمونه ساخته شده نیست٬ کافیست که فقط قوانین را رعایت کنید٬ آنگاه شما بر اساس شیوه خود الگوی مورد نظر خود را خواهید ساخت.
معادل در ساخت کلاسها
اگر یادتان باشد گفتیم که شش کلاس وجود دارند که برای آنها معدل ساخته شده
است٬ این کار استفاده از الگوها را راحتتر میکند٬ چراکه نیازی به ساختن
الگوهای دراز ندارید.
[0-9] معادلd : این الگو که به معنی هر عددی است.
[f v] معادل s: این الگو به معنی هر فضای خالی است.
[A-Za-z0-9_] معادلw : به معنی هر کلمهای است٬ در نوشتن الگوی پسورد از این معادل استفاده میشود.
[^0-9] معادلD : استفاده از این الگو به معنی هیچ عدد است. یعنی اینکه عددی نباشد.
نکته: در استفاده از علامت ^ گفتیم که نشان دهنده ابتدای رشته است٬ این در زمانی است که این علامت بیرون علامتهای [] قرار گیرد. اگر این علامت در داخل دو علامت [^]قرار گیرد به منفی کننده تبدیل میشود.
[^f v] معادلS :به معنی نبودن فضای خالی استفاده میشود. همانطور که میبینید علامت ^ داخل دو علامت [] قرار گرفته است.
[^A-Za-z0-9_] معادل W : این الگو درست بر عکس الگوی بالایی که گفتیم در داخل پسورد استفاده میشود است. یعنی هیچ کاراکتر کلمهای.
دیگر توابع مورد استفاده در عبارات منظم:
Preg_split()
این تابع یک رشته را با استفاده از یک الگوی عبارت منظم تکه تکه می کند و حاصل را به صورت یک آرایه بازگشت می دهد.
preg_replace()
الگوی عبارت منظم را در یک رشته جستجو کرده و آن را در متنی که به آن داده می شود جابجا می کند.
preg_grep()
الگوی عبارت منظم را در تمام عناصر یک آرایه جستجو کرده و موارد یافت شده را به صورت یک آرایه بازگشت می دهد.
یادگیری فنون الگو سازی چیزیست که شما باید در طول زمان٬ با تمرین و استفاده از آنها در سیستمهای خود بدان تبحر پیدا کنید. پس در اینجا از شرح بیشتر خودداری میکنیم.
خدا دلت رو آباد کنه وخلوصت رو روز افزون اگه خوندی مارم دعا کن