آشنایی مقدماتی با عبارات منظم و طرح ها

May 2, 2005 at 09:46 pm

عبارات منظم یا Regular Expressions بحث جالبی از برنامه نویسی php است. که کمی پیچیده تر و دشوار تر از سایر بحث هاست. ما در اینجا قصد نداریم ( زیرا نمی توانیم) این مبحث را به طور مفصل مرور کنیم. تنها سعی می شود با یک مثال ساده علاقمندان را با این مقوله آشنا کنیم.

عبارات منظم را می توان مشابه یک سازمان و سیستم در نظر گرفت که برای اعمال یک Pattern یا همان الگو خاص به کار می رود. درابتدا ما این الگو رو تعریف می کنیم بعد با کمک توابع موجود، الگو رو با متن مچ می کنیم. حله؟ پس اول به ایجاد یک الگو ساده می پردازیم. در ساخت الگو یا همون طرح ما به یه سری علائم سمبلیک نیاز داریم که این علائم چند دسته تقسیم می شن:

Literals یا الفاظ: هر جوری که نوشته می شن ترجمه خواهند شدند. مثلا “d”به همون حرف d ترجمه می شه، نه چیزی کمتر نه بیشتر. Metacharacters یا فوق کاراکترها: اینا یه خورده سخته چون دارای معانی و مفهوم های خاصی هستند تنها توصیه می کنم در تمرین های فرضی خودتان آن ها را فراگیرد تا ملکه ذهنتان گردد و از حفظ کردن آن ها بپرهیزید. مثلا “a+” با تعداد یک یا بیشتر از یک کاراکتر a یا بعبارتی حداقل یک a متناظر می شود هم چنین است برای “a?” که با صفر و یا یک a معادل می شود. لیست این کاراکترها را می توانید در اینجا مشاهده کنید. برای مثال یک طرح ساده برای متناظر شدن با آدرس پست الکترونیک:

".+@.+/..+"

اگر بخواهیم الگو فوق رو تحلیل کنیم: اولین قسمت طرح (+.) مشخص می کنه که آدرس ما حداقل باید با یک کاراکتر شروع بشه. بعد از این کاراکتر باید یک علامت @ قرار بگیره و مجددا بعد از اون باید حداقل یک کاراکتر وجود داشته باشه. قسمت بعدی (.) معلوم می کنه که باید یک نقطه وجود داشته باشه و در نهایت بعد از نقطه باید (+.)حداقل یک کاراکتر دیگه وجود داشته باشه.

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

حال نوبت به توابعی می رسه که برای مچ کردن الگو با رشته باید به کار ببریم. خود php از دو دو تابع ereg و eregi استفاده می کنه. این دوتا با هم یه فرق کوچک دارند اولی رو می گن case-sensitive هست، یعنی نسبت به بزرگ و کوچک بودن حروف حساسه و دومی رو می گن case-insensitive که این حساسیت رو نداره. صورت کلی استفاده از این دو تابع هم به شکل زیره، که Pattern معرف الگو یا همون طرح هستش و String هم رشته مورد نظر. البته همون طور که می دونید می شه طرح و یا رشته رو در پارامترهای دیگه ایی هم ذخیره کرد و در داخل تابع پارامترها رو به کار ببریم.

ereg ("pattern", "string");

حالا اینا به چه دردی می خوره؟ یکی از کاربرد های عمده عبارات منظم و طرح ها، کنترل فیلد های موجود در صفحاته. مثلا شما یه فرم دارید که باید کاربر اونو پر کنه. این فرم شامل فیلد های پست الکترونیک، نام و نام خانوادگی، شماره تلفن و … است. اگر در طرح صفحات دقت نشده باشه کاربر می تونه بجای آدرس پست الکترونیک، یه آدرس وارد کنه که اصلا شبیه ایمیل هم نباشه و سرویس دهنده ما هم آدرس وارده رو قبول کنه. یا موارد اشتباه دیگر. که مسلما این یک ضعف بزرگ برای آن وب سایت به شمار خواهد رفت.

برای نمونه، من در فیلد عضویت در خبرنامه این قابلیت رو اضافه کردم. می تونید با وارد کردن آدرس های اشتباهی اون رو تست کنید. همان طور که در ابتدا ذکر کردم این فقط قطره ایی از دریای عبارات منظم و طرح ها بود. اگر علاقمند به مبحث هستید مطالعه مطالب اینجا خالی از لطف نخواهد بود. با تشکر، مرتضی الوانی .

دسته: پی اچ پی | نویسنده: مرتضی الوانی
  1. 7 نظر برای این مطلب ارسال شده است. نظر خود را ارسال کنيد »

  1. 1

    mohammad


    سلام
    آقا مرتضی خیلی توپ بود ولی اگه یه مثال میزدی بهتر میشد :grin:

    May 2, 2005 at 10:57 pm

  2. 2

    rahim


    می تونستی به عنوان نمونه اینو قرار بدی
    برای چک کردن ایمیل ورودی(یه مثال کاملا ساده و پرکاربرد)

    if (ereg(^([a-zA-Z0-9_-.]+)
    @(([[0-9]{1,3}.[0-9]{1,3}.
    [0-9]{1,3}.)|(([a-zA-Z0-9-]
    +.)+))([a-zA-Z]{2,4}|[0-9]
    {1,3})(]?)$, $_POST[’email’])) {
    echo “Please enter a valid e-mail address.”;
    }

    May 3, 2005 at 12:44 pm

  3. 3

    میلاد قیصری


    با سلام و خسته نباشید خیلی بیش از حد جالب بود باز هم منتظر میمونیم.
    یا حق

    May 4, 2005 at 11:02 am

  4. 4

    هانیما


    سلام ببخشی من خیلی مبتدی هستم و کسی رو نمیشناسم تا بتونه تو یه مسا ئله به این سادگی کمکم کنه سنه کمی هم دارم و در عینه حال روم نمیشه با کسی مشگلم رو مطرح کنم برایه همین از شما کمک می خوام چند وقتیه که برام ایمیل میاد و بلد نیستم چکش کنم منو راهنمایی کنید ممنون

    June 14, 2005 at 2:41 pm

  5. 5

    هانیما


    یه ایمیله ساده رو چجوری باید چک کرد؟

    June 14, 2005 at 2:42 pm

  6. 6

    عباس


    اگه ميشه يه آموزش كامل در مورد regular expression بگذار.

    قول ميدم استقبال خوبي ازش به عمل بياد.
    چون هيچ كجا اين آموزش وجود نداره.
    البته به فارسي.

    چون ميدونم با سوادي بهت گفتم آموزشش رو بگذار.

    September 5, 2007 at 4:07 pm

  7. 7

    محمد جعفر


    مثل اینکه eregi منقرض شده. بسیار هم کند عمل می‌کنه،
    لطفا در بارهی preg_match بنویسید که فکر کنم تو همه جا از جمله Find/Replace در دریم ویور مشترکه

    August 4, 2010 at 10:46 pm