50درصد تخفیف سورس فروشگاهی دیجی کالا + اپلیکیشن اندروید تا پایان این هفته - کد تخفیف : off50
با تخفیف میخرم

آموزش Regular Expression در php (عبارت باقاعده)

  • آپدیت شده در تاریخ

آموزش Regular Expression در php (عبارت باقاعده)

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

احتمالا حدس زدید که این مقاله آموزش کمی طولانی تر از آموزش های php دیگری که داشتیم , خواهد بود . پس با ما همراه شوید تا تمام موارد را بررسی کنیم . تمام مثال های کاربردی و regex های مهمی که برای بررسی ورودی های کاربران استفاده میشود را در مقاله اعتبارسنجی فرم ها در php معرفی کردیم که حتما از آن در پروژه هایی که می نویسید , استفاده کنید. همچنین یک مثال کامل در مورد استخراح تمام url های سایت در php را با استفاده از regex را ارایه دادیم .

 

مفهوم عبارات با قاعده

اگر بخواهیم یک تعریف مختصر از عبارات با قاعده یا Regular Expressions (و به اختصار Regex) در دنیای کامپیوتر و برنامه نویسی ارائه کنیم، می توان گفت روش ها و قواعدی هستند که برای استخراج یا بررسی وجود قسمت یا توالی خاصی از یک مقدار (عددی، متنی و…) به کار می روند، در واقع این قواعد بر مبنای قوانین خاصی، بخش بخصوصی از یک متن یا عدد و… را با توجه به تنظیمات ما اسخراج می کنند که در محاسبات دقیق و پیچیده بسیار کاربرد خواهد داشت.

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

عبارات با قاعده چگونه نوشته می شوند؟

پس از آشنایی با مفهوم Regular Expressions، سوالی که به ذهن می رسد این است که عبارات با قاعده چگونه نوشته می شوند؟ در پاسخ باید گفت که دستورات در این روش از طریق توالی علامت ها، کلمات، حروف یا کاراکترهای خاصی (مانند [] () + \ *? | , w \W\ 0-9 a-z و…) که هر کدام مفهوم ویژه ای دارند، تعریف می شوند، در واقع از کنار هم قرار گرفتن این علامت ها، دستور ویژه ای شکل گرفته و قسمت خاصی از رشته مورد نظر استخراج یا بررسی می شود،

در زبان php توابع زیر را برای کار با عبارات یا قاعده در نظر گرفته اند :

  • preg_match
  • preg_match_all
  • preg_replace
  • preg_split
  • preg_quote

خب قصد داریم در ادامه آموزش Regular Expression در php  با مثال تمام موارد لازم برای کار با رشته ها را بررسی کنیم .

بررسی وجود یک کلمه خاص در یک رشته متنی در PHP

فرض کنید می خواهیم وجود کلمه php را در متن “php is easy and powerful” بررسی کنیم، در این صورت با استفاده از تابع preg_match خواهیم نوشت:

خروجی کد بالا برابر با ۱ خواهد بود، البته ۱ در اینجا یعنی کلمه مورد نظر در عبارت وجود دارد (۱ معادل TRUE است)، حال اگر کلمه php را با حروف بزرگ در دستور بالا قرار دهیم، نتیجه صفر خواهد بود، مگر اینکه یک کاراکتر با قاعده (در ادامه خواهیم دید که این کاراکتر را modifier یا تغییر دهنده می نامند) دیگر به دستورمان اضافه کنیم که بزرگ یا کوچک بودن حروف را نادیده بگیرد، این کاراکتر حرف i به معنی incasesensitive یا غیر حساس به حروف بزرگ و کوچک است:

نوشتن یک RewriteRule در htaccess

فرض کنید لینک داینامیکی به صورت index.php?user=2740 داریم که می خواهیم با استفاده از mod rewrite در htaccess آن را به صورت user/2740 دریافت کنیم، در این صورت در فایل htaccess خواهیم نوشت:

ملاحظه می کنید که در اینجا نیز عبارات با قاعده بسیار کاربرد دارند.

مفهوم و کاربرد کاراکترهای دستورات با قاعده

همان طور که دیدیم، دستورات در عبارات با قاعده با استفاده از حروف و کاراکترهای خاصی که در صفحه کلید کیبورد وجود دارد نوشته می شوند، اما مسلما بدون رعایت اصول خاص (syntax) و درک مفهوم این کاراکترها، عملا از نوشتن یا تفسیر صحیح این دستورات ناتوان خواهیم بود، لذا در ادامه به صورت موردی با این موارد و کاربرد آنها آشنا خواهیم شد.

حروف (لاتین)

اولین و ساده ترین مواد اولیه ای که در یک دستور Regex به کارمان می آید حروف …abcd هستند، یعنی با قرار دادن آنها در یک دستور با قاعده، توالی از رشته متنی که شامل این کاراکترها باشد، انتخاب می شود، مثال:

خروجی کد بالا عدد ۱ خواهد بود، چون توالی عبارت abc در رشته abcdefg وجود دارد.
نکته: الزامی به رعایت ترتیب الفبایی نیست، مهم این است که توالی قسمت Regex در رشته متنی وجود داشته باشد.

اعداد

اعداد ۰ تا ۹ و ترکیب آنها، دومین موادی است که می توانیم در یک دستور با قاعده از آنها استفاده کنیم، کاربرد ساده این کاراکترها مانند مثالی است که پیش تر ملاحظه کردیم:

برای مشخص کردن تمام اعداد به این الگو پیش میرویم :

که خروجی برابر ۱ خواهد بود.

کاراکتر . (هر کاراکتری)

کاراکتر بعدی که در عبارات با قاعده کاربرد دارد، نقطه یا dot است که به معنی هر کاراکتری (به جزء خط جدید) است، به طور مثال:

خروجی کد بالا عدد ۱ خواهد بود، اگرچه ما در دستور با قاعده از عبارت Re.ex استفاده کرده ایم، اما همان طور که گفتیم، نقطه در این دستورات شامل هر کاراکتری (به جزء خط جدید) می شود.
نکته: زمانی که بخواهیم کاراکتر نقطه از حالت دستوری (یعنی حالتی که شامل همه کاراکترها می شود) خارج و صرفا در نقش یک حرف (در نقش نقطه یا به اصطلاح literal) ظاهر شود، باید با یک بک اسلش (\) آن را درج کنیم، به این صورت اثر آن به عنوان یک کاراکتر دستوری از دست می رود،

مثال:

که کد بالا خروجی ۰ را چاپ می کند، چون .\ تنها شامل خود نقطه می شود نه کاراکتر دیگری (به عبارت دیگر اگر در رشته متنی، Regex برابر Re.ex بود، بررسی بالا عدد ۱ را چاپ می کرد).

کاراکتر [ ] (دست کم یک کاراکتر)

قلاب، کروشه یا bracket کاراکتر دیگری است که در دستورات با قاعده بسیار کاربرد دارد، این کاراکتر در حالت دستوری جزء علامت های محدود ساز است و تنها کاراکترهای خودش را شامل می شود (در حالت عادی حساس به حروف بزرگ و کوچک)، به فرض [a] تنها شامل رشته ای می شود که دست کم حرف a در آن به کار رفته باشد، چند نمونه از کاربرد این علامت:

  • [a] – شامل رشته ای می شود که دست کم a در آن به کار رفته باشد، مانند abcd، bacd، aaab و… (به طور مثال شامل bcd، ۱۲۳، bbbb و… نمی شود).
  • [zxn] – شامل رشته ای می شود که دست کم z یا x یا n در آن به کار رفته باشد، مانند zxn، regex، zend و… (به طور مثال شامل ZXN، abc، ۱۲۳ و… نمی شود).
  • [a-z] – شامل رشته ای می شود که دست کم حروف a تا z (الفبای انگلیسی با حروف کوچک) در آن به کار رفته باشد، مانند Php، javascript، Bbbb و… (به طور مثال شامل ۱@۲،  JAVASCRIPT، ۱۲۳ و… نمی شود).
  • [A-Z] – شامل رشته ای می شود که دست کم حروف A تا Z (الفبای انگلیسی با حروف بزرگ) در آن به کار رفته باشد، مانند PHP، JavaScript، BBBB و… (به طور مثال شامل abc، ۱۲۳، aa و… نمی شود).
  • [۰-۹] – شامل رشته ای می شود که دست کم اعداد ۰ تا ۹ در آن به کار رفته باشد، مانند ۴۹CC، ۲۲۲، b123 و… (به طور مثال شامل abcd، p%@&*، aa و… نمی شود).
  • [abct-z] – شامل رشته ای می شود که دست کم حرف a یا b یا c یا t تا z در آن به کار رفته باشد (دقت کنید که در اینجا چون توالی حروف انگلیسی بهم خورده است، علامت – از حرف t به بعد را شامل می شود)، مانند You، bb، abc و… (به طور مثال شامل Yo، ۱۴۲، de و… نمی شود).

نکته ۱: همان طور که در دستورات بالا ملاحظه کردید، علامت – یک کاراکتر همراهی کننده در عبارات با قاعده (یعنی در کنار سایر علامت ها استفاده می شود) و به معنی “تا” است.
نکته ۲: علامت – در صورتی که در ابتدا یا انتهای دستور قرار گیرد، خاصیت دستوری خود را از دست می دهد، به طور مثال [az-] شامل a یا z یا علامت – می شود (همچنین [-az]).
نکته ۳: علامت [ یا ] چنانچه بلافاصله بعد از اولین قلاب قرار گیرد، حالت دستوری خود را از دست می دهد، به طور مثال [zxn[] شامل z یا x یا n و یا علامت [ می شود.

کاراکتر [ ^] (به جزء کاراکتر)

در کنار کاراکتر قلاب، کاراکتر قلاب و علامت ^ وجود دارد که برعکس حالت معمول، به معنی هر کاراکتری به جزء آنچه درون قلاب تعریف شده است می باشد، به فرض [a^] شامل رشته ای می شود که به جزء حرف a، کاراکتر دیگری در آن باشد (اگر تنها حرف a باشد، نتیجه FALSE خواهد بود)، یا [acd^] شامل رشته ای می شود که به جزء حروف a و c و d، کاراکتر دیگری نیز داشته باشد،

به چند مثال توجه کنید:

  • [a^] – شامل رشته ای می شود که به جزء a، کاراکتر دیگری در آن به کار رفته باشد، مانند abcd، bacd، aaab و… (به طور مثال شامل aaaa، a، aa و… نمی شود).
  • [zxn^] – شامل رشته ای می شود که به جزء z و x و n، کاراکتر دیگری در آن به کار رفته باشد، مانند ZXN، regex، zend و… (به طور مثال شامل zxn، xnnn، zzz و… نمی شود).
  • [a-z^] – شامل رشته ای می شود که به جزء حروف a تا z (الفبای انگلیسی با حروف کوچک)، کاراکتر دیگری در آن به کار رفته باشد، مانند Php، Javascript، bbbb1 و… (به طور مثال شامل php، javascript، bbbb و… نمی شود).
  • [A-Z^] – شامل رشته ای می شود که به جزء حروف A تا Z (الفبای انگلیسی با حروف بزرگ)، کاراکتر دیگری در آن به کار رفته باشد، مانند Php، JavaScript، BBBb و… (به طور مثال شامل PHP، JAVASCRIPT، BBBB و… نمی شود).
  • [۰-۹^] – شامل رشته ای می شود که به جزء اعداد ۰ تا ۹، کاراکتر دیگری در آن به کار رفته باشد، مانند ۴۹CC، ۲۲%، b123 و… (به طور مثال شامل ۰۰۰، ۲۲۲، ۱۲۳ و… نمی شود).
  • [abct-z^] – شامل رشته ای می شود که به جزء حرف a و b و c و t تا z (با حروف کوچک)، کاراکتر دیگری در آن به کار رفته باشد، مانند You، b&b، ab1c و… (به طور مثال شامل u، bb، abc و… نمی شود).

نکته: به حساس بودن دستورات به حروف بزرگ و کوچک دقت کنید.

کاراکتر ^ (شروع)

علاوه بر استفاده از کاراکتر ^ (hat) در درون قلاب، این کاراکتر به تنهایی نیز در دستورات مربوط به عبارات با قاعده کاربرد فراوان دارد، علامت ^ (خارج از قلاب و در شروع دستور) به معنی نقطه شروع یک رشته است، به طور مثال دستور bcd^ به معنی هر عبارتی است که از ابتدا با bcd شروع شده باشد، لذا رشته bcde را شامل می شود، اما abcd را خیر (چون عبارت اول دقیقا با bcd شروع شده اما عبارت دوم با abc)،

مثال:

خروجی دستور بالا برابر ۱ یا TRUE خواهد بود، چون عبارت دقیقا با php شروع شده، اما اگر مثال به صورت زیر باشد :

خروجی برابر ۰ یا FALSE خواهد بود، چون در دستور تنها رشته ای را در نظر گرفته ایم که از شروع با عبارت php باشد، در حالی که شروع رشته ما با عبارت فرضی why است.
نکته: همان طور که پیش از این ملاحظه کردید، کاربرد علامت ^ درون قلاب با حالت عادی متفاوت است.

کاراکتر $ (پایان)

در کنار علامت ^ (نقطه شروع رشته)، از علامت $ (dollar) برای تعیین نقطه پایان یک عبارت استفاده می شود، به طور مثال دستور $bcd به معنی هر عبارتی است که در انتها به bcd ختم شود، لذا رشته abcd را شامل می شود، اما bcde را خیر (چون عبارت اول دقیقا به bcd ختم شده اما عبارت دوم به cde)،

مثال:

خروجی دستورات بالا عدد ۱ خواهد بود، چون رشته مورد بررسی ما دقیقا به عبارت Web ختم شده، اما اگر رشته به صورت فرضی زیر بود:

نتیجه برابر ۰ می شد، چون عبارت به web ختم نشده بلکه به علامت ?! ختم شده است.
نکته: در کدنویسی حرفه ای و پیشرفته، معمولا از ترکیب پیچده تری از این دستورات ساده استفاده می شود، اما قواعد و اصول کار به همین صورت است.

کاراکتر { } (تعداد تکرار)

در دستورات عبارات با قاعده از علامت {} (آکولاد یا brace) برای مشخص کردن تعداد تکرار یک کاراکتر استفاده می شود، به طور مثال {۳}a شامل عبارتی می شود که a در آن سه بار به صورت متوالی تکرار شده باشد، به فرض aaa، عدد داخل {} اگر به صورت تکی باشد، نمایانگر تعداد حداقل تکرار متوالی است، به فرض {۵} یعنی الزاما باید حداقل ۵ بار متوالی یک کاراکتر تکرار شده باشد، اما اگر به صورت دو قسمتی باشد (به طور مثال {۱,۳})، عدد اول حداقل تکرار و عدد دوم حداکثر را نشان می دهد، یعنی حداقل ۱ بار و حداکثر سه بار تکرار را شامل می شود،

به مثال زیر توجه کنید:

خروجی مثال بالا عدد ۱ خواهد بود، چون رشته با حرف b شروع شده، حرف b از یک تا سه بار در آن تکرار شده و نهایتا نیز به b ختم شده، اما اگر همین دستور را به شکل زیر تغییر دهیم:

نتیجه برابر ۰ خواهد بود، چرا که حرف b چهار بار متوالی در رشته تکرار شده، در حالی که در دستور ما ۱,۳ بار مد نظر است.
دقت کنید که علامت {} در حالت عادی تنها یک کاراکتر یا مجموعه ای از کاراکترهای قبل از خود را بررسی می کند، به طور مثال در دستور {۱,۳}web، تنها تکرار حرف b مورد نظر است، نه کل عبارت، به مثال زیر توجه کنید:

نتیجه دستور بالا ۰ یا FALSE خواهد بود، چون تکرار حرف b بین یک تا سه بار مد نظر است، اما این حرف چهار بار متوالی در رشته مورد بررسی تکرار شده است.

کاراکتر * (صفر تکرار یا بیشتر)

علامت * (star یا ستاره)، کاراکتر دیگری است که در عبارات با قاعده کاربرد دارد، این کاراکتر به معنی صفر تکرار یا بیشتر است، به طور مثال  *a شامل رشته ای می شود که حرف a در آن صفر بار یا به دفعات بیشتری تکرار شده باشد، یا به طور مثال دستور *ab^ شامل رشته ای می شود که با a شروع شده و حرف b در آن صفر بار یا بیشتر تکرار شده باشد، به مثال زیر توجه کنید.

خروجی دستور بالا برابر ۱ خواهد بود، چون [ab] یعنی یا حرف a یا حرف b در رشته باشد، و در قسمت دوم دستور نیز صفر تکرار یا بیشتر حرف c مد نظر بوده که عملا تاثیری در عبارت با قاعده ما ندارد، اما اگر همین دستور به صورت زیر بود:

نتیجه برابر ۰ یا FALSE خواهد بود، چون در قسمت اول دستور یعنی [ad]، وجود کاراکتر a یا d در رشته مد نظر است، اما چنین کاراکترهایی در book وجود ندارد.

کاراکتر + (یک تکرار یا بیشتر)

علامت + (plus یا به اضافه)، کاربردی مشابه * دارد،  با این تفاوت که در اینجا حداقل یک بار تکرار نیاز است، به عبارت دیگر این علامت نمایانگر یک بار تکرار یا بیشتر است، به طور مثال +a شامل رشته ای می شود که حداقل یک a در آن وجود داشته باشد، یا +۵۵۰ شامل عددی می شود که حداقل یک صفر در آن به کار رفته باشد، به مثال زیر توجه کنید.

خروجی کد بالا ۱ یا TRUE خواهد بود، چون بر طبق دستور مد نظر ما، رشته باید با a-z به تعداد ۳ کاراکتر شروع شده، سپس یک نقطه داشته باشد و بعد از نقطه، یک یا بیشتر کاراکتر a یا b یا c داشته باشد، سپس یک نقطه و در نهایت به عدد ۰ تا ۹ برسد (چون از علامت $ استفاده نکرده ایم، مابقی رشته بررسی نمی شود)، اما اگر علامت $ را در انتهای دستور بالا اضافه کنیم، نتیجه ۰ یا FALSE خواهد بود، چون تعداد ۱ عدد در انتها مد نظر ما است، اما ۵۵ شامل دو عدد است.

کاراکتر ? (اختیاری)

علامت ? (question mark یا سوال) در عبارات با قاعده کاربرد به خصوصی دارد، از این نشان برای اختیاری (optional) کردن کاراکتر قبل از آن استفاده می شود، به طور مثال jpe?g هم شامل jpg می شود و هم شامل jpeg، چون بعد از حرف e علامت ? قرار گرفته و لذا بود یا نبود این حرف اختیاری است، به مثال زیر توجه کنید.

فرض کنید آدرس فایلی به صورت زیر است:

اکنون می خواهیم نام فایل را بدون پسوند از آدرس بالا استخراج کنیم، بدین منظور پارامتر دومی به تابع preg_match اضافه کرده و Regex زیر را می نویسیم.

شکل کامل کد ما به صورت زیر خواهد بود.

خروجی قسمت echo کد بالا عدد ۱ یا مقادیر Boolean آن برابر TRUE خواهد بود، اما اگر با print_r از متغیر match (که خروجی تابع preg_match به صورت یک آرایه است) خروجی بگیریم، نتیجه به شکل زیر خواهد بود.

نکته ۱: در عبارت با قاعده بالا، کاراکتر جدید () به کار رفته که در ادامه در مورد آن خواهیم گفت.
نکته ۲: به عملکرد خنثی سازی علامت \ توجه کنید (برای خارج کردن کاراکتر . و / از حالت دستوری، از \ استفاده شده).

کاراکتر ( ) (ساخت گروه)

اگرچه علامت () (parenthesis یا پرانتز) در کاربردهای عادی مفهوم مشخصی دارد، اما این علامت در عبارات با قاعده طور دیگری تفسیر می شود و نمایانگر گروهی از توالی ها (pattern) است، به زبان ساده هر آنچه در بین () قرار گیرد به عنوان یک مجموعه دستور قابل استفاده است که در برخی توابع و دستورات به کار می رود، به طور مثال کد زیر در حالت عادی برای کلید ۱ آرایه match چیزی چاپ نمی کند:

نتیجه قسمت print_r کد بالا:

اما اگر همین کد را به صورت زیر ویرایش کنیم:

خروجی قسمت print_r به صورت زیر خواهد بود:

ملاحظه می کنید که دستورات داخل () به عنوان یک گروه خاص پردازش شده و نتیجه در یک کلید مجزا به خروجی ارسال شده است.
حال فرض کنید می خواهیم عدد ۲۲ را نیز در یک کلید مجزا داشته باشیم، در این صورت از علامت () در داخل علامت () دیگر به صورت زیر گروه استفاده می کنیم:

خروجی قسمت print_r به صورت زیر خواهد بود:

کاراکتر | (یا)

اگر خاطرتان باشد گفتیم که علامت – در دستورات با قاعده به معنی “تا” است، حال می خواهیم علامت دیگری را معرفی کنیم که به معنی “یا” است، به طور مثال a|b یعنی یا a یا b، به مثال زیر توجه کنید.

خروجی مثال بالا Iran خواهد بود، با توجه به دستور Regex اگر به جای Iran عبارت Tajikistan نیز وجود داشت، دستور معتبر بود و Tajikistan به عنوان خروجی چاپ می شد.

حروف خاص در عبارات با قاعده

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

حرف d\

حرف d\ (حروف کوچک) به معنی هر عددی (d مخفف digit)، مثال:

نکته ۱: پیش تر گفتیم که علامت \ کاراکترهای دستوری را به حالت عادی تبدیل می کند، اما در اینجا برعکس حالت قبل، علامت \ کاراکترهای عادی را به دستور تبدیل می کند (d یک حرف عادی است، اما d\ یعنی هر عددی).
نکته ۲: بزرگ یا کوچک بودن حروف خاص در عبارات با قاعده، ممکن است بر روی مفهوم آنها اثرگذار باشد.

حرف D\

حرف D\ (حروف بزرگ) به معنی هر کاراکتری که عدد نباشد، مثال:

نکته: تمام مثال ها فرضی و صرفا جهت درک راحت تر مطالب ارائه شده اند، لذا ممکن است برخی مواقع عادی به نظر نرسند!

حرف w\

حرف w\ به معنی هر حرف الفبایی (لاتین)، مثال:

حرف W\

حرف W\ به معنی هر کاراکتری که حرف الفبایی یا عدد نباشد، مثال:

حرف s\

حرف s\ به معنی هر فضای خالی (Whitespace)، مثال:

حرف S\

حرف S\ به معنی هر کاراکتری که فضای خالی نباشد، مثال:

Modifiers در Regular Expressions

اگر به نکاتی که در حین آموزش Regular Expression در php به آن اشاره شد، توجه کرده باشید، سه مورد در کدهایی که تا این لحظه نوشتیم خودنمایی می کند:

  • کدها به حروف بزرگ یا کوچک حساس هستند، به طور مثال [a-z] الزاما شامل حروف کوچک می شود.
  •  دستور . (هر کاراکتری) شامل خط جدید (line break) نمی شود، به طور مثال کد زیر عدد ۰ یا FALSE را برمی گرداند:

مشکل از آنجا نشات می گیرد که مقادیر متغیر فرضی str با یک خط جدید شکسته شده.

  • اگر بخواهیم با علامت های ^ و $، ابتدا و انتهای رشته را مشخص کنیم، در حالتی که مقادیر رشته از چندین خط جدید تشکیل شده باشد، به مشکل بر خواهیم خورد. راه حل مشکلات بالا در دستورات با قاعده، استفاده از تغییر دهنده ها یا Modifiers است، Modifiers چیزی نیستند جزء چند حرف خاص که در انتهای دستور قرار می گیرند و رفتار آن را تغییر می دهند.

modifier i

برای نادیده گرفتن بزرگ یا کوچک بودن حروف، از تغییر دهنده i (برگرفته از case-insensitive) استفاده می کنیم، به طور مثال:

modifier s

برای محاسبه خط جدید در هنگامی که از کاراکتر دستوری . استفاده می کنیم، تغییر دهنده s (برگرفته از single line) کاربرد دارد، مثال:

خروجی برابر ۱ یا TRUE خواهد بود.
نکته: در این حالت خود خط جدید نیز یک کاراکتر محسوب شده، لذا درج علامت + (یک تکرار یا بیشتر) بعد از . ضرورت دارد.

modifier m

برای اعمال دستورات عبارات باقاعده به صورت خط به خط، تغییر دهنده m (برگرفته از multiline) کاربرد دارد، به عبارتی استفاده از این تغییر دهنده باعث می شود تا دستور ما در رشته هدف، به جای بررسی عادی، برای هر خط به صورت جداگانه بررسی شود،

مثال:

اما اگر همین کد را بدون m استفاده کنیم، نتیجه ای نخواهیم داشت:

نکته: منظور از خط، در واقع همان کاراکتر (نامرئی) n\ یا r\ است.

همانطور که دیدید , می توان به جرات گفت یکی از پرکاربردترین تکنیک های جستجو در متن استفاده از  Regular Expression است . دریافت و فیلتر دقیقا همان چیزی که از متن یا ورودی کاربر می خواهیم , با عبارت های باقاعده بسیار آسان تر است . سعی کنید به طور مداوم این مفاهیم را مرور کنید و از آن در کد ها و پروژه هاتون بخصوص در بحث اعتبار سنجی فرم ها چه سمت کلاینت و سمت سرور در کد های php خود به کار ببرید .

این مفاهیم در بیشتر زبان های برنامه نویسی و اسکریپت نویسی مثل javascript , bash , csharp و .. مشابه است . پس با یکبار یادگیری می توانید بصورت کارآمد در همه جا استفاده کنید . همچنین در بحث ورودی های کاربری و ساخت یک محیط user-friendly در ساخت ربات تلگرام این موارد بسیار کاربردی و مهم است

مطالب مقاله آموزش Regular Expression در php (عبارت باقاعده) شاید کمی طولانی و حجیم  باشد برای همین یک pdf که به اصطلاح cheatsheet یا برگه تقلب است را براتون آماده کردم تا با مرور آن این مفاهیم را به طور کامل یاد بگیری تا ملکه ذهنتان شود

برای تست آنلاین و دیدن آنی نتایج میتوانید از این سایت بهره ببرید

هرگونه سوالی داشتید از قسمت نظرات اقدام کنید . سریعا , پاسخگوی سوالات شما هستیم .

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

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

آموزش های رایگان بیشتر در اینستاگرام ما ...

NETPARADIS /
مطالب زیر را حتما بخوانید
دیدگاه کاربران (۴۰)

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

  1. mohsen ۲ آبان ۱۳۹۹

    سلام. خداییش ۴۰ تا مقاله لاتین خوندم مثل این کامل نبود ممنونم.
    مرسی

    پاسخ
  2. عارف دیلمی ۲۴ مهر ۱۳۹۹

    سلام. بسیار کامل و عالی بود . من که تا الان نصف مطلب رو خوندم خیلی استفاده کردم….
    با تشکر

    پاسخ
    1. حسن شفیعی ۲۴ مهر ۱۳۹۹

      سلام. خیلی خوشحالیم که مفید واقع شده.
      موفق و پیروز باشید.

      پاسخ
  3. Mohammad ۱۸ شهریور ۱۳۹۹

    سلام خسته نباشید.
    چطوری می تونم هاست یا فایل php را به یک سرورشکن وصل کنم و سایت را با آن لود کنم؟

    پاسخ
    1. حسن شفیعی ۱۸ شهریور ۱۳۹۹

      سلام. ممنون.
      یک فایل php ایجاد کنید داخل فایل این کد رو قرار بدید
      echo file_get_contents(‘https://site.com’);

      به جای https://site.com آدرس صفحه یا سایت موردنظر را قرار بدید.
      توجه داشته باشید که حتما هاست شما غیرایران باشد.
      موفق باشید

      پاسخ
      1. Mohammad ۱۹ شهریور ۱۳۹۹

        سپاس فراوان

        پاسخ
  4. Saeed ۴ مرداد ۱۳۹۹

    با اختلاف بهترین مقاله ای بود که توی این مبحث چه توی سایت های خارجی چه ایرانی میشد پیدا کرد! بسیار متشکرم

    پاسخ
    1. حسن شفیعی ۴ مرداد ۱۳۹۹

      سلام. خوشحالیم که مفید واقع شده.
      موفق باشید.

      پاسخ
  5. امیرحسین فضلی ۲۴ خرداد ۱۳۹۹

    سلام. من از url میخوام یه چیزایی رو بگیرم. برای مثال :

    #/Ali/(.*)#

    البته متاسفانه اینجا راست چین هست. من میخوا توی url

    http://localhost/Amir/{name}

    هر چی که جای {name} باشه رو بگیرم. و تا جایی بگیرم که به اسلش نرسیده. یعنی مثلا

    http://localhost/Amir/{name}/Ali

    دیگه خروجی این نیاد بشه {name}/ali

    چون ممکنه چندین متغیر {} از url بگیرم، واسه همین میخوام. و اله خودمم با فانکشن هایی میتونستم بعد از اسلش رو از استرینگ پاک کنم.

    پاسخ
  6. محسن ۳۱ فروردین ۱۳۹۹

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

    پاسخ
    1. حسن شفیعی ۳۱ فروردین ۱۳۹۹

      سلام. درخواستتون بررسی و اگر ریجکس نوشته شد براتون ایمیل میشه

      پاسخ
  7. رجکس ۱۷ بهمن ۱۳۹۸

    اموزشتون تو وب فارسی به ندرت پیدا میشه
    و اینکه رجکس چیه چندبار تو متن دیدم چ هست این regex ?

    پاسخ
    1. حسن شفیعی ۱۷ بهمن ۱۳۹۸

      سلام.
      به خلاصه شده ی Regular Expression همان regex گفته میشه.
      موفق باشید.

      پاسخ
  8. مزرجی ۱۵ بهمن ۱۳۹۸

    سلام
    بابت آموز‌ش مفیدتون ممنون
    یه کدی نوشتم ولی خب به مقصود نرسیدن
    که میخواستم مثلا متغییر من با کلمه /set یا تنظیم تست شروع بشه و بعد یک فاصله و بعد هم یک @ باشد و بعد از آن کارکاکتر ها بین ۳ تا ۱۵ باشن
    ممنون میشم کمک کنید
    /php
    $text=”/set @jsagxi”;
    if(preg_match(‘#^(/set|تنظیم تست)(\s@)+(\S{3,7})#i’, $text)){
    echo true;
    }

    پاسخ
  9. حسین ۲۳ دی ۱۳۹۸

    سلام

    من می خوام با همین عبارات با قاعده یک تمپلیت انجین شخصی بسازم که یک نمونش توی لاراول هست
    مثلا توی لاراول این {{}} معادل هست و کاراکتر @ برای جداکردن دستورات شخصی سازی شده پی اچ پی از بین اون همه کد html تشخیص میده و جدا می کنه
    من می خوام یک همچین جداسازی انجام بدم یعنی یه سری کاراکتر تعریف کنم و این کاراکترارو از توی متن تشخیص بدم و دستورات درونشون رو بگیرم و پردازشارو انجام بدم با دستورات پی اچ پی و خروجی دستوراتُ جایگزین کنم
    بعنوان مثال

    #-each(ph-variable as ph-key->ph-value)

    {- ph-value ph-name=”anyname” -}

    #-endeach

    لاراول به همین شکل حالا من یه تغییراتی دادم که مثلا بخوام در این حالت کدهای شخصی پی اچ پیمو از کدهای اچ تی ام ال جدا کنم
    چطوری می تونم اینکارو با همین عبارات با قاعده انجام بدم
    چطوری می تونم هر کاراکتریُ بین مثلا {- -} که معادل لاراولش میشه {{ }} تشخیص بدم و با دستورات اصلی خوده پی اچ پی بعد از انجام یه سری کارها خروجیُ جایگزین کنم یعنی همون ph-value که مربوط میشه به حلقه و اون متغیر جدایی که تعریف کردم و یک مقدار بهش دادم یعنی ph-name
    زیاد سرچ کردم راجبش اما به این شکلی که مثالشو زدم چیزی پیدا نکردم و همه ی آموزش هارو از سایت ها خارجی و بعلاوه همین چیزهایی که شما نوشتی خواندم اما نمی تونم انجامش بدم
    کلا اگر بخوام حرفه ای برنامه نویسی کنم باید این عبارات با قاعدرو یاد بگیرم و دیدم هم توی سورس کدهای حرفه ای پلاگین ها از عبارات با قاعده زیاد استفاده شده برای معنی کردن رشته به حالت دلخواه یا تشخیص پیشرفته
    کلا زبان های برنامه نویسی هم به همین شکل ساخته میشن کلا واسه انجام کارهای حرفه ای مثله ساخت تملپیت انجین یاد گیریش ضروری هست وگرنه کار بیش از حد سخت میشه

    عبارت با قاعده u// رو هم لطفا یک توضیحی بدید می دونم چه استفاده ای داره و ازش استفاده کردم ولی نمی دونم معنیش چی میشه
    یک کد پیدا کردم واسه آرایه سازی رشته که از همین عبارت استفاده کرده کدش هم این هست
    preg_split(‘//u’, $str, -1)
    این عبارت با قاعده هر رشته ایُ تبدیل به آرایه می کنه و اصلا خطای علامت سوال نمیده
    دنبال این بودم که اینجور کاراکترهارو ☺☻♦○/\{}*&,.◘ یا درواقع هر کاراکتریُ تبدیل به آرایه کنم بدون دلمیتر یعنی چسبیده به هم که این کد رو پیدا کردم و کار داد

    پاسخ
  10. محمد ۱۲ مهر ۱۳۹۸

    واقعا عالی و مفید♥

    پاسخ
    1. حسن شفیعی ۱۲ مهر ۱۳۹۸

      سلام. خوشحالیم که مفید واقع شده.
      موفق باشید.

      پاسخ
  11. محسن ۲۶ شهریور ۱۳۹۸

    سلام اگه بخوام مثلا قیمت روز طلای ۱۸ عیار را از سایت http://www.tgju.org/ بگیرم چطوری باید اونا بنویسم؟ ممنون

    پاسخ
    1. حسن شفیعی ۲۶ شهریور ۱۳۹۸

      سلام. در اینجور موارد کار با domdocument برای دسترسی به مقدار خاص از بین این همه تگ های تو در تو بسیار توصیه میشه و regex کار رو سخت می کنه چون اساس کار با رشته ها هست و ولی هدف domdocument کلا کار با همین موارد است.
      برای همین کد کوتاه برای دریافت قیمت روز طلای ۱۸ عیار را از سایت http://www.tgju.org رو قرار دادم میتونید استفاده کنید :

      خروجی :
      طلا ۱۸ ۴,۰۶۳,۰۰۰ (۰٫۳۹%) ۱۶,۰۰۰
      موفق باشید.

      پاسخ
      1. محسن ۲۷ شهریور ۱۳۹۸

        بسیار عالی
        یه سوال دیگه که دارم اینه که میشه فقط با کد javascript این کار را انجام داد و از php دیگه استفاده نکنیم؟
        مثلا یه چیزی شبیه این: document.getElementById(‘l-geram18’)[0].innerText
        ممنون میشم

        پاسخ
      2. حسن شفیعی ۲۷ شهریور ۱۳۹۸

        به اینصورتی که فکر می کنید با جاوا اسکریپت امکان پذیر نیست. در جاوا اسکریپت شما باید درخواستی رو به صفحه ارسال کنید مثلا ajax بعد اینو append کنید یا داخل متغیر بریزید و چندین regex تو در تو بزنید پس عملا کار سختی در پیش دارید و اگر زیاد آشنا نیستید مطمینا نمی تونید پیاده سازی کنید.
        اگر هم میخواید کد رو داخل js استفاده کنید باز می تونید این کدی که داده شده رو در فایل php ذخیره و از داخل js یک ajax بزنید و مستقیما بدون هیچ گونه عملیات رشته مربوطه که فقط قیمت هست رو دریافت کنید.

        پاسخ
  12. م ک ۲۸ تیر ۱۳۹۸

    عالی!

    پاسخ
  13. محمد ۲۷ خرداد ۱۳۹۸

    مرسی

    پاسخ
    1. حسن شفیعی ۲۷ خرداد ۱۳۹۸

      خوشحالیم که مفید واقع شده. موفق باشید.

      پاسخ
  14. saeed ۱۴ اردیبهشت ۱۳۹۸

    سلام عزیز خسته نباشید من میخوام از رسپون سایت یه مقدار خاصی رو رجکس کن
    رسپون سایت توی تابع $respone
    این قسمت
    این قسمتی ک گفتم میخوام رجکس و چاپ کنم
    ممنون میشم جواب بدید

    پاسخ
    1. حسن شفیعی ۱۴ اردیبهشت ۱۳۹۸

      سلام ممنون.
      طبق چیزی که می خواین از ریسپانس بردارید، باید یک الگویی را بنویسید و بعد برای تطابق الگو نیز از تابع preg_match بصورت زیر استفاده می کنید

      $check = preg_match(‘/427/’, $response);

      مقدار بین // در خط بالا همان الگوی ما است و مقداری که داخل $check ذخیره می شود همانررشته پیدا شده مورد نظر طبق الگو است که می توانید ان را چاپ یارجای دیگر استفاده کنید.
      اینجا مهم الگویی متناسب با رشته ای که می خواین استخراج کنید ایت که طبق اموزش بالا باید آن را بنویسید.
      موفق باشید.

      پاسخ
  15. کیومرث ۲۸ خرداد ۱۳۹۷

    سلام…ممنون به خاطر این آموزش خوبتون.
    تابع file_get_contents خوبه .ولی چرا برای بعضی از وب سایت ها مثل تابناک بد عمل می کنه و کارکترها درست نمیاد….
    $html = file_get_contents(“http://www”);

    حتی از هدر utf8 هم استفاده کردم .جواب نگرفتم

    پاسخ
    1. حسن شفیعی ۲۸ خرداد ۱۳۹۷

      سلام . خوشحالم که مفید واقع شده.

      بله در بعضی از وبسایت ها جلوی ارسال درخواست ها از ربات ها (اسکریپت) ها رو میگیرن و باید به همراه اون درخواست یک سری از هدرهای معتبر رو ارسال کنید تا این مورد رو بتونید به اصطلاح دور بزنید و به عنوان یک کاربر عادی جلوه بدید.
      برای اینکار ما نیاز داریم از curl استفاده کنیم که به ما امکان ست کردن هدر ها و یک سری قابلیت های دیگه رو میده و در آخرین کامنت آموزش https://netparadis.com/extract-webpage-urls-php نحوه انجام اون و کد کامل که روی تابناک جواب میده رو قرار دادم که میتونید استفاده کنید.

      موفق باشید.

      پاسخ
  16. امین ۳ خرداد ۱۳۹۷

    سلام با چه تابعی file_get_contentیا file_get_html متناسب برای Regular Expression کار با این باشه،بعد تفاوت خروجی های دو تابه که اول گفتم چی هست؟؟ و از هر کدوک کجا باید استفاده کرد

    پاسخ
    1. حسن شفیعی ۳ خرداد ۱۳۹۷

      سلام . خروجی تابع file_get_contents بصورت رشته (string) است که میتونید برای regex استفاده کنید (توابع کار با رشته ها)

      تابع file_get_html هم خروجی رو به صورت آبجکت آرایه ای برگشت میده که بصورت dom بین تگ ها پیمایش کنید بصورت زیر

      $dom = file_get_html($url);
      $tables = $dom->find('table');
      echo $tables[0];
      echo $tables[1];

      موفق باشید.

      پاسخ
      1. امین ۳ خرداد ۱۳۹۷

        ممنون از جوابتون،یه سوال دیگه اینکه استفاده از کدومیک حجم کمتر از حافظه رو برای پردازش می گیره،استفاده از تابع اولی یا دومی؟؟

        پاسخ
      2. حسن شفیعی ۳ خرداد ۱۳۹۷

        تابع اولی (file_get_contents)

        موفق باشید.

        پاسخ
      3. امین ۳ خرداد ۱۳۹۷

        سپاس حسن جان،خسته نباشی

        پاسخ
      4. حسن شفیعی ۳ خرداد ۱۳۹۷

        خواهش میکنم. موفق باشید.

        پاسخ
  17. امیر ۱۸ اردیبهشت ۱۳۹۷

    سلام ممنونم از اطلاعات مفیدتون.

    من راستش می خواستم یک جمله را از این صفحه HTML بیرون بکشم ولی هر کاری می کنم نمی تونم ابتدا و انتها فایل را بشناسونم جایی هم پیدا نکردم می تونید راهنمایی کنید ممنون: می خوام توی یک صفحه قسمت عنوان ها را بیرون بکشم. توی یک صفحه چندین عنوان داره. مثلا توی این قسمت این عنوان است: “A passion for mathematics: numbers, puzzles, madness, religion, and the quest for reality”
    این نمونه کدی هست که کار کردم.

    $sample = “title=” id=10060>A passion for mathematics: numbers, puzzles, madness, religion, and the quest for reality “;
    preg_match_all(“/id=[0-9]{5}>[^\s]/”, $sample, $match);
    print_r($match);

    ممنون می شوم راهنمایی بفرمایید

    پاسخ
    1. حسن شفیعی ۱۸ اردیبهشت ۱۳۹۷

      سلام . خوشحالم که مفید بوده . برای بدست آوردن مقدار های بین دو تگ از پترن (.*) استفاده کنید:

      که اگر بخواهیم این رو بصورت یک تابع و داینامیک برای تگ های مشخص استفاده کنیم میتونید از این تابع بهره ببرید.

      موفق باشید.

      پاسخ
      1. محمد ۲۰ اردیبهشت ۱۳۹۷

        چرا پارامتر tagname اصلا در تابع استفاده نشده؟

        پاسخ
      2. حسن شفیعی ۲۰ اردیبهشت ۱۳۹۷

        کد با عجله آماده شده برای همین مشکل پیش اومده بود که الان ویرایش و اوکی شده.

        پاسخ
      3. محمد ۲۰ اردیبهشت ۱۳۹۷

        ممنون که سریع پاسخ دادید 🙂
        رجکس با جستجوی کلمات فارسی سازگاره؟

        پاسخ
      4. حسن شفیعی ۲۰ اردیبهشت ۱۳۹۷

        خواهش میکنم. بله مشکلی نیست.

        پاسخ
دوره های آموزشی

دانلود رایگان کتاب آموزش PHP

صفر تا صد PHP و MySQL را یکجا یاد بگیرید
همین الان دانلود کن
نگران نباشید. ایمیل‌های مزاحم نمی‌فرستیم
close-link