منبع اصلی نوشتار زیر در این لینک قرار دارد

عبارات با قاعده در PHP – بخش دوم

توی نوشته قبلی، درباره عبارات با قاعده نوشتم، و حالا میخوام ادامش بدم.

کاراکتر نقطه “.”
فرض کنید میخواید تمام کلماتی که در ابتداشون h داره و در انتهاشون llo رو پیدا کنید. مثلا hello ، یا hallo یا hollo یا هر ترکیب دیگری. اینطوری میتونید از کاراکتر نقطه استفاده کنید.
به عبارتی کاراکتر نقطه میگه هر کاراکتری باشه مهم نیست. مثلا برای این مثالی که گفتم :

/h.llo/

بعد از h هر کاراکتری باشه، پذیرفته میشه.
آکولاد باز و بسته “{}”
درباره * گفتم برای اینکه صفر یا چند کاراکتر رو شامل بشه استفاده میشه (صفر یا تعداد نامحدود) برای + هم گفتم برای انتخاب ۱ یا هر چند تا که باشه مفیده، علامت سوال هم برای یک یا هیچی. منتها گاهی لازم میشه مثلا یه الگو دست کم سه بار تکرار بشه، حداکثر ۷ بار. خوب این موقع چی؟
اگه بخواید یه الگو دقیقا یه تعداد مشخصی تکرار بشه میتونید به این صورت بنویسید :

/hel{2}o/

یعنی یک he بعدش بلافاصله دو تا l (دقیقا دو تا ال انگلیسی) و بعد یه o. یعنی همون hello.
اینجوری هم میشه نوشت :

/wel{1,2}come/

این یه مشکل بزرگ رو حل میکنه. اینجوری اول یه we اگه باشه، بعد دست کم یکی یا حداکثر دو تا l (حرف ال انگلیسی) و بعد come این الگو درست در میاد. خوب خیلی خوبه :)‌ هر روایتی از کلمه خوش آمدید رو میشه بررسی کرد!
اگه بخوایم مینیمم رو مشخص کنیم ولی ماکزیمم مشخص نشه، میتونیم بنویسیم :

/wel{2,}come/

یعنی l باید دو بار دست کم تکرار شده باشه حالا اگه هزار بار هم تکرار شده باشه مشکلی نیست.

حالا برای نمونه :‌

/^.{5}$/

یعنی کلمه ای دقیقا پنج حرفی تشکیل شده از هر کاراکتری. یا

/^.{5,7}$/

یعنی یک رشته دست کم ۵ حرفی و دست بالا، ۷ حرفی مثلا hello یا rabbits یا rabbit

گروه کاراکتری -براکت باز و بسته “[]“
خوب اینا همه به کنار. من اگه بخوام یه سری کاراکتر خاص انتخاب کنم، چه کاری باید انجام بدم. مثلا میخوام اعداد مبنای ۱۶ به سبک PHP رو شناسایی کنم. یعنی یه الگو بنویسم که این اعداد رو شناسایی کنه.
این اعداد با صفر شروع میشن،‌بعد یه x و بعد کاراکترهای صفر تا نه، و A تا F . اینجوریه که نیاز به یک گروه کاراکتری احساس میشه. یه چیزی که بتونه یه کاراکتر رو از یه لیست انتخاب کنه.
خوب ببینید :

/0x[0-9A-Fa-f]+/

که یعنی یه صفر بعدش یه ایکس و بعدش اونچیزی که تو براکت قرار داره بین ۱ تا هر چند بار(علامت + در آخر رو دقت کنید.).
خوب اونی که توی براکت هست یعنی چی؟ یعنی صفر تا نُه، A تا F و a تا f . (حروف کوچک و بزرگ در عبارات با قاعده متفاوت هستن مگر در شرایطی که از کاراکتر تغییر دهنده i استفاده بشه که آخرای این پست یه چیزهایی مینویسم دربارش.)یعنی، این براکت برای انتخاب یه کاراکتر (دقیقا یکی) از لیستی که ارایه شده استفاده میشه.
یک لیست رو مثلا میشه اینطوری نوشت :

/[0123456789]/

یعنی اعداد صفر تا نه. به عبارتی میشه تک تک کاراکترهای مورد نظر رو ذکر کرد، که یه کمی طولانی میشه و فقط در یه سری موارد که این کاراکترهانظم ندارن مفیده. همین مثال نظم داره، به جای نوشتن صفر تا نُه، میشه نوشت :

/[0-9]/

پس در عمل کاراکتر – (hyphen ، dash ، منها) به عنوان رنج استفاده میشه.البته میشه مثل همون مثال بالاتر که نوشتم برای اعداد مبنای شانزده چند تا رنج رو پشت سر هم بنویسید، که بازم درسته.
اینجا میشه معنی رو برعکس کرد. برفرض مثال شما میخواید یه جا هر کاراکتری باشه، غیر از صفر تا نُه. علامت ^ رو تو نوشته قبلی توضیح دادم. این علامت اگه داخل گروه کاراکتری بیاد، معنی ای که قبلا داشت رو نمیده. اینجوری اگه در ابتدای یک گروه کاراکتری بیاد، یعنی بعد از علامت براکت باز ] اونوقت به صورت نقیض عمل میکنه :

/[^0-9]/

یعنی هر کاراکتری باشه درسته فقط صفر تا نُه نباشه. دقیقا برعکس بالایی.
نکته مهم اینه که براکت به معنی یه حرف هست. نه چند تا. برای اینکه چند تا بشه از ستاره، علامت سوال، بعلاوه و … استفاده میشه که بالاتر توضیح دادم.

تا همینجا اون الگویی رو که توی پست قبلی برای ایمیل گفتم میتونیم بررسی کنیم.

^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$

خوب این الگو رو حالا میشه معنی کرد.

یک الگوی نسبتا ساده برای بررسی آدرس ایمیل

یک الگوی نسبتا ساده برای بررسی آدرس ایمیل

۱- این یعنی آغاز خط و بلافاصله بعد از اون الگوی ۲ قرار گرفته باشه.
۲- در الگوی ۲ یک گروه کاراکتری متشکل از a تا z کوچک و بزرگ، صفر تا نُه، نقطه، زیرخط و علامت منها قرار گرفته. بلافاصله بعد از این گروه، یک علامت بعلاوه هست که یعنی از این گروه کاراکتری دست کم یکی و دست بالا! هر چند تا که باشه درسته. به عبارتی این میشه آدرس ایمیل قبل از @ مثلا در [email protected] میشه someone .
۳- علامت @ معنی خاصی نداره و میشه خودش. تا به اینجا شد، ابتدای خط، بلافاصله بعدش یک تا هر چند تا کاراکتر (الگوی ۲) و بعد بلافاصله یک علامت @.
۴- بعد یه گروه کاراکتری دیگه.اینبار یه کم تفاوت داره با الگوی اسم. چون این مربوط میشه به اسم دومین. توی [email protected] این میشه قسمت example یعنی بعد از @ و قبل از نقطه. اینبار دیگه نقطه و زیرخط نیستن چون این دو تا کاراکتر توی اسم مجازن، اما تو اسم دومین نه. بلافاصله بعدش هم یه علامت + (بعلاوه) اومده که یعنی الگوی کاراکتری یک یا هر چند بار میتونه تکرار بشه.
۵- اما نقطه، چون نقطه توی عبارت باقاعده معنی داره،‌ولی ما اینجا منظورمون دقیقا خود نقطه هست نه معنیش، بالاجبار باید قبلش یه بک اسلش \ بگذاریم که نقطه تعبیر نشه به هر کاراکتری، و معنی فقط نقطه اعمال بشه.
۶-بعد از نقطه پسوند میاد مثلا کام (com) یا آی آر (ir) یا گاهی کو دات آی آر (co.ir) کوتاهترین پسوند دو حرفیه مثل ir و بلندترین پنج حرفی مثل co.ir ، به همین دلیل نوشته شده {2,5} .تشکیل هم شده از حروف انگلیسی و نقطه. که اگه دقت کنید نقطه ای که داخل گروه کاراکتری قرار گرفته بک اسلش نداره، چون اونجا دیگه معنی همه کاراکترها رو نمیده و معنی خودش رو میده.(بعضی کاراکترها داخل گروه کاراکتری معنیشون فرق میکنه مثل همین نقطه یا ^ )
۷- بعدشم که آخر خط. یعنی بعد از این الگوها باید برسیم به آخر خط و ادامه نداشته باشه.

تغییر دهنده های الگو
بالاتر گفتم که (به طور مثال) کاراکترها در عبارات با قاعده به حروف کوچک و بزرگ حساس هستند. اما روش PCRE ، امکان یک سری تغییرات در روش رو میده. با اضافه کردن یه کاراکتر (یا چند تا) در انتهای الگوی مورد جستجو میشه یه سری تغییرات به وجود آورد.
مثلا کاراکتر i، باعث میشه که الگو دیگه به حروف کوچک و بزرگ حساس نباشه :

/[a-z0-9]*/i

تو این عبارت، اون کاراکتر i بعد از اسلش دومی منظور منه. این کاراکترها که بعد از اسلش دوم قرار میگیرن جزئی از الگو نیستن، فقط طریقه تعبیر الگو رو تغییر میدن. مثل همین کاراکتر i که اینجا هست.
البته این سری قصد توضیح کامل اینها رو ندارم، و میمونه برای پست های بعدتر! البته امیدوارم که وقتشو پیدا کنم!
دفعه دیگه یه کم بیشتر درباره الگوها تو PHP صحبت میکنم و کاربردهای مختلف رو بررسی میکنم.



برچسب ها : , , ,