عدد عبارت منظم php. درس های پی اچ پی - عبارات منظم با مثال. تجزیه لاگ آپاچی

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

در این پست نمونه هایی از استفاده از عبارات منظم را که خودم متوجه شدم، ارائه خواهم کرد.

جدول کاراکترهای خاص

شخصیت خاص شرح
\ نماد سپر. مثال: "/seo\/smo/"- با خطی که حاوی seo/smo است مطابقت دارد.
^ نماد شروع داده ها. مثال: "/^ SEO/"- با خطی که با کلمه seo شروع می شود مطابقت دارد.
$ پایان کاراکتر داده مثال: "/blog$/"رشته ای را که با کلمه blog ختم می شود مطابقت می دهد.
. هر کاراکتری غیر از خط جدید. مثال: "/seo.ult/"- مطابق با رشته seoopult، seo9ult، [ایمیل محافظت شده]و غیره.
در داخل این پرانتزها، کاراکترهایی فهرست شده‌اند که هر کدام از آنها می‌تواند در یک مکان مشخص باشد، اما فقط یکی. مثال: "/سئولت/"- فقط خطوط حاوی seopult، seokult یا seomult مطابقت داده می شود.
| یا. یک نمونه در زیر آمده است.
() الگوی فرعی
? یک یا صفر وقوع کاراکتر یا زیرالگوی قبلی.
* هر تعداد تکرار کاراکتر یا زیرالگوی قبلی. از جمله صفر.
+ یک یا چند ورودی
مثال: '/se+(op|om)?.*t/'- حرف s، سپس یک یا چند حرف e، پس از آن ترکیب op یا om ممکن است یک بار، یا شاید هرگز، سپس هر تعداد از هر کاراکتر و حرف t رخ دهد.
(الف، ب) تعداد تکرار کاراکتر یا زیرالگوی قبلی از a تا b. مثال: (0،) همان *، (0،1) همان ?، (3،5) 3، 4 یا 5 تکرار است.

ساده نمونه های phpاسکریپت هایی با استفاده از عبارات منظم:

1) عبارات قبلی و بعدی.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // کلمه ای را پیدا کنید که بعد از Box دارای ing باشد. اگر کلمه پیدا شود، تابع true و در غیر این صورت false خواهد شد.$pattern1 = "/Box(?=ing)/" ; preg_match ($pattern1 , "Box Day" ) ; // false preg_match ($pattern1 , "Boxing Day" ); // درست است، واقعی // کلمه ای را پیدا کنید که ing بعد از کادر ندارد. اگر کلمه پیدا شود، تابع true و در غیر این صورت false خواهد شد.$pattern2 = "/box(?!ing)/" ; preg_match ($pattern2 , "Box for iPhone و iPad" ); // true preg_match ($pattern2 , "روز بوکس چیست؟" ); // false preg_match ($pattern2 , "css-moz-box-shadow" ); // درست است، واقعی // قبل از ing کلمه ای را پیدا کنید که کادر ندارد. اگر کلمه پیدا شود، تابع true و در غیر این صورت false خواهد شد.$pattern3 = "/(؟

[^<]+?~""وبلاگ سئو"،$text؛ echo $text؛ ?>

3) مقدار رتبه الکسا سایت داده شده را دریافت و نمایش دهید.

1 2 3 4 5 6 7 8 9 "#
(.*?)
#سی"، file_get_contents( "http://www.alexa.com/siteinfo/($url)") ، $a ) ; برگشتی trim (str_replace ("," , "" , strip_tags ($a [ 1 ] ) ) ); ) $alexa = alexa($url ) ; echo $alexa ; ?>

(.*?)

#si، file_get_contents("http://www.alexa.com/siteinfo/($url)")، $a)؛ return trim(str_replace(""""strip_tags($a))); ) $alexa = alexa($url)؛ echo $alexa؛ ?>

4) عنوان صفحه را دریافت و نمایش دهید.

1 2 3 4 5 (.*)<\/title>/s" , $str , $m ) ; echo $m [ 1 ] ; ?>

(.*)<\/title>/s"، $str، $m؛ echo $m؛ ?>

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 \n \r \t ]/", "" , $content ) ; // جایگزینی کاراکترهای خط جدید و برگه با فاصله$content = preg_replace ("/(2،)/" , " " , $content ) ; // بیش از 2 فاصله را با یکی جایگزین کنید preg_match_all("/ ]*href=(?:"| \" )(.*)(?:"|\" )[^<>]*>(.*)<\/a>/iU", $content , $links ) ; // پیوندها را جمع آوری کنید اگر (sizeof ($links [ 1 ] ) > 0 ) // در صورت یافتن پیوندها($out = array() ; // آرایه ای از پیوندهای خارجی foreach ($links [ 1 ] به عنوان $v ) ( if (preg_match ("/http:\/\/(www\.)(0,1)" . $domain . "/i" , $v ) ) // پیوندهای داخلی را حذف کنید(ادامه ؛ ) if (preg_match ( "/(http:|https:)؟\/\/(www\.)(0,1)(.*)/i"، $v )) // مرجع خارجی( $out = $v ; ) ) return $out ; ) return array(); ) $domain = "سایت" ; $content = file_get_contents ("http://site/" ) ; $getoutlinks = getoutlinks($content, $domain ) ; برای ($i = 0 ؛ $i<= count ($getoutlinks ) ; $i ++ ) { echo $getoutlinks [ $i ] . "
" ; } ?>

]*href=(?:"|\")(.*)(?:"|\")[^<>]*>(.*)<\/a>/iU، $content، $links)؛ // جمع آوری پیوندها اگر (sizeof($links) > 0) // اگر پیوندها یافت شد ($out = array(); // آرایه پیوندهای خارجی foreach ($links به عنوان $v ) ( if (preg_match("/http:\/\/(www\.)(0,1)".$domain."/i"، $v)) // پیوندهای داخلی را حذف کنید ( ادامه دهید؛ ) if (preg_match ("/(http:|https:)?\/\/(www\.)(0,1)(..com/"); $getoutlinks = getoutlinks($content, $domain); برای ( $i = 0;$i<= count($getoutlinks); $i++) { echo $getoutlinks[$i]."
"; } ?>

جایی که:
preg_replace- جستجو و جایگزینی را با استفاده از یک عبارت منظم انجام می دهد.
preg_match- بررسی یک عبارت منظم را انجام می دهد.
preg_match_all- همه مسابقات را پیدا می کند، در حالی که preg_match - فقط اولین.
file_get_contents- محتویات فایل را به صورت یک خط دریافت کنید.
کوتاه کردن- فاصله های ابتدا و انتهای یک رشته را حذف می کند.
str_replace- رشته جستجو را با رشته جایگزین جایگزین می کند.
strip_tags- برچسب های html و php را از یک رشته حذف می کند.
اندازه- تعداد عناصر موجود در متغیر را بدست می آورد.
شمردن- تعداد عناصر آرایه یا تعداد خصوصیات شی را می شمارد.

مختلط preg_match(الگوی رشته، موضوع رشته [، آرایه و مطابقت [، پرچم‌های بین‌المللی [، افست بین‌المللی]]]

موضوع متن داده شده را برای مطابقت با الگو جستجو می کند

اگر پارامتر تطابق اختیاری مشخص شده باشد، با نتایج جستجو پر می شود. عنصر $matches شامل قسمتی از رشته خواهد بود که با وقوع کل الگو مطابقت دارد، $matches بخشی از رشته که با الگوی فرعی اول مطابقت دارد و غیره.

پرچم ها می توانند مقادیر زیر را داشته باشند:

PREG_OFFSET_CAPTURE

اگر این پرچم مشخص شده باشد، برای هر زیر رشته یافت شده، موقعیت آن در رشته منبع نشان داده می شود. باید به خاطر داشت که این پرچم فرمت داده های برگشتی را تغییر می دهد: هر رخداد به عنوان یک آرایه برگردانده می شود که عنصر صفر آن حاوی زیررشته یافت شده است و عنصر اول حاوی offset است. این پرچم در PHP 4.3.0 و بالاتر موجود است.

پارامتر flags اضافی از زمان PHP 4.3.0 در دسترس بوده است.

جستجو از چپ به راست، از ابتدای خط انجام می شود. پارامتر آفست اختیاری را می توان برای تعیین موقعیت شروع جایگزین برای جستجو استفاده کرد. پارامتر افست اضافی از PHP 4.3.3 در دسترس است.

اظهار نظر:استفاده از پارامتر offset معادل جایگزینی رشته منطبق با substr ($subject، $offset) در هنگام فراخوانی تابع نیست. preg_match_all()، از آنجایی که الگو می تواند شامل شرایطی مانند ^ , $ یا (? . مقایسه کنید:

در حالی که این مثال

تابع preg_match()تعداد موارد مطابق پیدا شده را برمی گرداند. می تواند 0 باشد (هیچ منطبقی یافت نشد) و 1 باشد زیرا preg_match()پس از اولین بازی یافت شده خاتمه می یابد. اگر نیاز به یافتن یا شمارش همه موارد مشابه دارید، باید از تابع استفاده کنید preg_match_all(). تابع preg_match()برمی گرداند نادرستدر صورت بروز هرگونه خطایی در حین اجرا

سرنخ:از تابع استفاده نکنید preg_match()، اگر می خواهید وجود یک رشته فرعی را در رشته داده شده بررسی کنید. برای این کار استفاده کنید strpos()یا strstr()، زیرا آنها این کار را بسیار سریعتر انجام می دهند.


مثال 2: یافتن کلمه "وب" در متن

/*
دنباله خاص \b در الگو به معنای مرز کلمه است،
بنابراین، تنها یک رخداد مجزا از کلمه "وب" مطابقت دارد
ماسک، بر خلاف "تار" یا "تار عنکبوت".
*/
if (preg_match("/\bweb\b/i" , "PHP زبان انتخابی برنامه نویسی وب است.")) {
اکو "ورودی پیدا شد.";
) دیگر (
اکو "ورودی یافت نشد.";
)preg_match("/\bweb\b/i" , "PHP زبان انتخابی برنامه نویسی وب سایت است.")) {
اکو "ورودی پیدا شد.";
) دیگر (
اکو "ورودی یافت نشد.";
}
?>

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

بیایید با یک حکمت برنامه نویسی محبوب شروع کنیم:

برخی از افراد وقتی با مشکلی روبرو می شوند، فکر می کنند: "آره، من باهوش هستم، آن را با عبارات منظم حل می کنم." الآن آن ها دو مشکل دارند.

نمونه های قالب

بیایید با چند مثال ساده شروع کنیم. اولین عبارت در تصویر زیر به دنبال دنباله ای از 3 حرف است، که در آن حرف اول "k" است، دومی هر حرف روسی است، و سومین عبارت "t" به روشی غیر حساس است (به عنوان مثال "cat" یا " CAT" با این الگو مطابقت دارد). عبارت دوم متن را برای مدتی در قالب 12:34 جستجو می کند.

هر عبارتی با یک کاراکتر جداکننده (جداکننده در انگلیسی) شروع می شود. نماد / معمولاً به عنوان آن استفاده می شود، اما کاراکترهای دیگری که هدف خاصی در عبارات منظم ندارند، مانند ~، # یا @، می توانند استفاده شوند. اگر کاراکتر / بتواند در عبارت وجود داشته باشد از جداکننده های جایگزین استفاده می شود. سپس الگوی رشته مورد نظر ما می آید و به دنبال آن جداکننده دوم قرار می گیرد و یک یا چند حرف پرچم می توانند در انتها قرار گیرند. آنها هنگام جستجوی متن گزینه های اضافی را تنظیم می کنند. در اینجا نمونه هایی از پرچم ها آورده شده است:

  • i - می گوید که جستجو باید به حروف بزرگ و کوچک حساس باشد (به طور پیش فرض به حروف بزرگ حساس است)
  • u - می گوید که عبارت و متن مورد جستجو برای رمزگذاری utf-8 استفاده می کند، نه فقط از حروف لاتین. بدون آن، جستجوی نویسه‌های روسی (و سایر نویسه‌های غیر لاتین) ممکن است به درستی کار نکند، بنابراین همیشه باید آن را قرار دهید.

خود قالب از کاراکترهای منظم و طرح های خاص تشکیل شده است. خوب، برای مثال، حرف "k" در عبارات منظم به معنای خودش است، اما نمادها به معنای "هر عددی از 0 تا 5 می تواند در این مکان باشد." در اینجا لیست کاملی از کاراکترهای خاص وجود دارد (در کتابچه راهنمای php به آنها متاکاراکتر گفته می شود) و همه کاراکترهای دیگر در عبارت منظم معمولی هستند:

در زیر معنای هر یک از این کاراکترها را تجزیه و تحلیل خواهیم کرد (و همچنین توضیح می دهیم که چرا حرف "ё" به طور جداگانه در عبارت اول قرار گرفته است)، اما در حال حاضر سعی می کنیم عبارات منظم خود را در متن اعمال کنیم و ببینیم چه اتفاقی می افتد. PHP دارای یک تابع خاص preg_match ($regexp، $text، $match) است که یک عبارت منظم، متن و یک آرایه خالی را به عنوان ورودی می گیرد. بررسی می‌کند که آیا متن دارای زیررشته‌ای است که با الگوی داده‌شده مطابقت دارد یا خیر و اگر نه، ۰ یا اگر وجود دارد ۱ را برمی‌گرداند. و در آرایه پاس شده، اولین تطابق یافت شده با عبارت منظم در عنصر با اندیس 0 قرار می گیرد. بیایید یک برنامه ساده بنویسیم که عبارات منظم را برای رشته های مختلف اعمال کند:

اکنون که مثال را دیدیم، اجازه دهید عبارات منظم را با جزئیات بیشتری بررسی کنیم.

پرانتز در عبارات منظم

بیایید معنی انواع مختلف براکت ها را دوباره مرور کنیم:

  • پرانتزهای فرفری a(1,5) تعداد تکرارهای کاراکتر قبلی را مشخص می کند - در این مثال، عبارت به دنبال 1 تا 5 حرف متوالی "a" است.
  • پرانتز مربع به معنای "هر یک از این کاراکترها" است، در این مورد، حروف a، b، c، x، y، z یا یک عدد از 0 تا 5 است. در داخل کروشه، سایر کاراکترهای خاص مانند | یا * - آنها یک کاراکتر منظم را نشان می دهند. اگر در ابتدا علامت ^ در کروشه های مربع وجود داشته باشد، معنی معکوس می شود: "هر یک از نویسه ها، به جز آنهایی که نشان داده شده اند" - برای مثال، [^a-c] به معنای "هر یک کاراکتر، به جز a، b یا c" است. .
  • پرانتز کاراکترها و عبارات را گروه بندی می کند. برای مثال در عبارت abc+ علامت مثبت فقط به حرف c اشاره دارد و این عبارت به دنبال کلماتی مانند abc, abcc, abccc می گردد. و اگر براکت های a (bc) + را قرار دهید، کمیت بعلاوه قبلاً به دنباله bc اشاره دارد و عبارت به دنبال کلمات abc، abcbc، abcbcbc می گردد.

توجه: محدوده کاراکترها را می توان در پرانتز مشخص کرد، اما به یاد داشته باشید که حرف روسی ё جدا از حروف الفبا است و برای نوشتن "هر حرف روسی" باید [а-яё] بنویسید.

bexleshi

اگر به آموزش های دیگر در مورد عبارات منظم نگاه کرده باشید، احتمالا متوجه شده اید که بک اسلش در همه جا متفاوت نوشته می شود. در جایی یک بک اسلش می نویسند: \d اما اینجا در مثال ها 2 بار تکرار می شود: \\d . چرا؟

زبان عبارت منظم از شما می خواهد که یک بار اسلش را بنویسید. با این حال، در رشته های تک و دو نقل قول در PHP، بک اسلش نیز معنای خاصی دارد: کتابچه راهنمای رشته ها. خوب، برای مثال، اگر بنویسید $x = "\$"; سپس PHP آن را به عنوان یک ترکیب خاص می گیرد و فقط کاراکتر $ را در رشته وارد می کند (و موتور regex از بک اسلش قبل از آن اطلاعی نخواهد داشت). برای درج دنباله \$ در یک رشته، باید بک اسلش را دو برابر کنیم و کد را به صورت $x = "\\$" بنویسیم. .

به همین دلیل، در برخی موارد (جایی که دنباله ای از کاراکترها در PHP معنای خاصی دارند) باید بک اسلش را دو برابر کنیم:

  • برای نوشتن در عبارت منظم \$ ، در کد "\\$" می نویسیم.
  • برای نوشتن \\ در عبارت منظم، هر بک اسلش را دو برابر می کنیم و "\\\\" را می نویسیم.
  • برای نوشتن یک بک اسلش و یک عدد (\1) در یک عبارت منظم، اسلش باید دو برابر شود: "\\1"

در موارد دیگر، یک یا دو اسلش معکوس نتیجه یکسانی را نشان می دهد: "\\d" و "\d" یک جفت کاراکتر \d را در رشته وارد می کنند - در حالت اول، 2 اسلش معکوس دنباله ای برای درج یک اسلش است. ، در حالت دوم دنباله خاصی وجود ندارد و کاراکترها همانطور که هستند درج می شوند. با استفاده از echo می توانید بررسی کنید که چه کاراکتری در رشته درج می شود و موتور عبارت منظم چه چیزی را می بیند: echo "\$"; . بله، سخت است، اما چه کاری می توانید انجام دهید؟

ساختارهای ویژه در عبارات منظم

  • \d به دنبال هر رقمی است، \D - هر کاراکتری غیر از یک رقم
  • \w با هر حرف منفرد (هر الفبای)، رقم یا زیرخط _ مطابقت دارد. \W با هر کاراکتری به جز حرف، عدد، خط زیر مطابقت دارد.

همچنین، یک شرط راحت برای اشاره به مرز کلمه وجود دارد: \b. این ساختار به این معنی است که در یک طرف آن باید یک کاراکتر وجود داشته باشد که یک حرف / عدد / خط زیر (\w) است و در طرف دیگر - نه. خوب، مثلاً می خواهیم کلمه «گربه» را در متن پیدا کنیم. اگر عبارت منظم /cat/ui را بنویسیم، دنباله این حروف را در هر جایی پیدا می کند - به عنوان مثال، در داخل کلمه "جانور". واضح است که این چیزی نیست که ما می خواستیم. اگر یک شرط مرزی کلمه را به عبارت منظم اضافه کنیم: /\bcat\b/ui، اکنون فقط کلمه جداگانه "cat" جستجو می شود.

کتابچه راهنمای

  • نحو عبارات منظم در PHP، توضیحات مفصل
مختلط preg_replace(الگوی مختلط، جایگزینی مختلط، موضوع مختلط [، محدودیت بین‌المللی])

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

جایگزینی می‌تواند حاوی ارجاعاتی به شکل \\ n یا (از PHP 4.0.4) $n باشد که دومی ترجیح داده می‌شود. هر مرجع با یک زیررشته متناظر با الگوی فرعی پرانتز n جایگزین می شود. n می تواند مقادیری از 0 تا 99 داشته باشد، با مرجع \\ 0 (یا $0) مربوط به وقوع کل الگو است. الگوهای فرعی از شماره گذاری می شوند. از چپ به راست، از یک شروع کنید.

هنگام استفاده از جایگزینی حروف عام با استفاده از ارجاعات فرعی، ممکن است موقعیتی پیش بیاید که یک رقم بلافاصله بعد از ماسک می آید. در این مورد، نماد \\n منجر به یک خطا می شود: ارجاع به زیرالگوی اول و به دنبال آن 1 به صورت \\11 نوشته می شود که به عنوان ارجاع به زیرالگوی یازدهم تفسیر می شود. این سوء تفاهم را می توان با استفاده از ساختار \$(1)1 که به یک ارجاع مجزا به الگوی فرعی اول و به دنبال آن رقم 1 اشاره می کند، از بین برد.

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

آوریل 1، 2003

اگر در حین اجرای تابع یک الگوی مطابق پیدا شود، مقدار تغییر یافته موضوع برگردانده می شود، در غیر این صورت متن اصلی موضوع برگردانده می شود.

سه پارامتر اول تابع preg_replace()می تواند آرایه های یک بعدی باشد. اگر آرایه از کلیدها استفاده می کند، هنگام پردازش آرایه، آنها به ترتیبی که در آرایه قرار دارند گرفته می شوند. تعیین کلیدها در آرایه برای الگو و جایگزینی اختیاری است. اگر همچنان تصمیم به استفاده از شاخص‌ها دارید، از تابع برای مطابقت با الگوها و رشته‌های درگیر در جایگزینی استفاده کنید. ksort()برای هر یک از آرایه ها


مثال 2: استفاده از آرایه هایی با شاخص های عددی به عنوان آرگومان های تابع preg_replace()

$string = "روباه قهوه ای سریع از روی سگ تنبل پرید.";$patterns [ 0 ] = "/quick/" ;
$patterns [ 1 ] = "/brown/" ;
$patterns [ 2 ] = "/fox/" ;$replacements [ 2 ] = "خرس" ;
$replacements [ 1 ] = "سیاه" ;
$replacements [ 0 ] = "slow" ;preg_replace ($patterns, $replacements, $string);
?>

نتیجه:

نتیجه:

خرس سیاه کند از روی سگ تنبل پرید.

اگر پارامتر موضوع یک آرایه باشد، جستجوی الگو و جایگزینی برای هر یک از عناصر آن انجام می شود. نتیجه برگشتی نیز یک آرایه خواهد بود.

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

اصلاح کننده /e رفتار تابع را تغییر می دهد preg_replace()به گونه ای که پارامتر جایگزینی پس از انجام تعویض های لازم به صورت کد PHP تفسیر شده و تنها پس از آن برای جایگزینی استفاده می شود. هنگام استفاده از این اصلاح کننده، مراقب باشید: پارامتر جایگزین باید حاوی کد PHP معتبر باشد، در غیر این صورت در خط حاوی فراخوانی تابع preg_replace()، یک خطای نحوی رخ خواهد داد.


مثال 3: با الگوهای متعدد جایگزین کنید

$patterns = آرایه ( "/(19|20)(\d(2))-(\d(1,2))-(\d(1,2))/",
"/^\s*((\w+))\s*=/" );
$replace = array("\\3/\\4/\\1\\2" , "$\\1 =" );
echo preg_replace ($patterns , $replace , "(startDate) = 1999-5-27" );
?>

این مثال خروجی خواهد داد:

تمام تگ های HTML را به حروف بزرگ تبدیل می کند


مثال 5. مبدل HTML به متن

// خروجی $document باید حاوی یک سند HTML باشد.
// نیاز به حذف تمام تگ های HTML، بخش های جاوا اسکریپت،
// کاراکترهای فضای خالی. تعویض برخی نیز ضروری است
// موجودیت های HTML به معادل خود.
$search = آرایه( ""]*?>.*?"سی", // جاوا اسکریپت را قطع کنید
""<[\/\!]*?[^<>]*?>"si"، // تگ های HTML را نوار می کند
""([\r\n])[\s]+"" , // کاراکترهای فضای خالی را حذف می کند
""&(quot|#34);"i" , // جایگزین موجودیت های HTML می شود
""&(amp|#38);"i" ,
""&(lt|#60);"i"،
""&(gt|#62);"i" ,
""&(nbsp|#160);"i" ,
""&(iexcl|#161);"i" ,
""&(cent|#162);"i" ,
""&(پوند|#163);"i"،
""&(copy|#169);"i" ,
""(\d+);"e"); // به عنوان کد php تفسیر کنید$replace = آرایه("" ,
"" ,
"\\1" ,
"\"" ,
"&" ,
"<" ,
">" ,
" " ,
chr(161)
chr(162)،
chr(163)،
chr(169)
"chr(\\1)" );$text = preg_replace ($search , $replace , $document );
?>

هنگام کار با متون در هر زبان برنامه نویسی مدرن، توسعه دهندگان دائماً با وظایف بررسی داده های وارد شده برای مطابقت با الگوی مورد نظر، جستجو و جایگزینی قطعات آزمایشی و سایر عملیات معمولی برای پردازش اطلاعات نمادین روبرو هستند. توسعه الگوریتم های تأیید خود منجر به از دست دادن زمان، ناسازگاری کد برنامه و پیچیدگی در توسعه و نوسازی آن می شود.

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

عبارات منظم در PHP

زبان PHP شامل سه مکانیسم برای کار با عبارات منظم است - "ereg"، "mb_ereg" و "preg". متداول ترین رابط "preg" است که توابع آن دسترسی به کتابخانه پشتیبانی از عبارت منظم PCRE را فراهم می کند، که در ابتدا برای زبان Perl توسعه یافته بود، که همراه با PHP است. توابع Preg مطابق با یک الگوی خاص در زبان عبارت معمولی به دنبال موارد منطبق در یک رشته متن معین می گردند.

مبانی نحو

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

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

مثلاً در بیان /\d(3)-\d(2)-\d(2)/mجدا کننده خواهد بود «/» ، به دنبال آن الگو و نماد "م"یک اصلاح کننده خواهد بود.

قدرت کامل عبارات منظم با متاکراکترها کدگذاری می شود. متاکاراکتر اصلی زبان، بک اسلش - "\" است. نوع شخصیتی را که از آن پیروی می کند معکوس می کند (یعنی یک کاراکتر معمولی تبدیل به متاکاراکتر می شود و بالعکس). یکی دیگر از متاکاراکترهای مهم اسلش "|" است که الگوهای جایگزین را مشخص می کند. نمونه های بیشتری از متاکاراکترها:

PHP، هنگام پردازش عبارات منظم، یک فضا را به عنوان یک کاراکتر مهم جداگانه در نظر می گیرد، بنابراین عبارات ABCWHERE و ABCWHERE متفاوت هستند.

الگوهای فرعی

در PHP، الگوهای فرعی معمولی با پرانتز متمایز می شوند و گاهی اوقات به آنها "زیرعبارت" می گویند. توابع زیر را انجام دهید:

    انتخاب گزینه های جایگزین. مثلا قالب گرما (بعضی|پرنده|)با کلمات مطابقت دارد "گرما"، "پرنده آتشین"و "کباب". و بدون براکت، فقط یک رشته خالی، "پرنده" و "گرم" خواهد بود.

    الگوی فرعی "هیجان انگیز".این به این معنی است که اگر یک رشته فرعی در الگو مطابقت داشته باشد، در نتیجه همه موارد منطبق برگردانده می شوند. برای وضوح، بیایید مثالی بزنیم. با توجه به عبارت منظم زیر: برنده دریافت می کند ((طلا|طلا)(مدال|کاپ)) -و یک رشته برای جستجوی موارد منطبق: "برنده مدال طلا می گیرد". علاوه بر عبارت اصلی، جستجو به موارد زیر منجر می شود: "مدال طلا", "مدال"، "طلا".

عملگرهای تکرار (کوادیفایر)

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

برای توصیف تکرارها، از quadrifiers استفاده می شود - متا کاراکترها برای تنظیم کمیت. Quadifiers دو نوع هستند:

  • عمومی، محصور در پرانتز؛
  • به اختصار

کمیت کننده عمومی حداقل و حداکثر تعداد تکرار مجاز عنصر را به صورت دو عدد در پرانتزهای فرفری مشخص می کند، مانند: x(2.5). اگر حداکثر تعداد تکرار ناشناخته باشد، آرگومان دوم حذف می شود: x(2,).

کمیت‌نماهای مخفف نمادهایی برای رایج‌ترین تکرارها هستند تا از بارگذاری بیش از حد نحو جلوگیری شود. معمولاً از سه علامت اختصاری استفاده می شود:

1. * - صفر یا بیشتر تکرار، که معادل (0،) است.

2. + - یک یا چند تکرار، یعنی،).

3.؟ - صفر یا فقط یک تکرار - (0.1).

مثال های بیان منظم

برای کسانی که در حال یادگیری عبارات منظم هستند، نمونه ها بهترین آموزش هستند. در اینجا چند مورد وجود دارد که با حداقل تلاش پتانسیل عالی خود را نشان می دهند. همه کدهای برنامه نویسی با نسخه های PHP 4.x و بالاتر سازگاری کامل دارند. برای درک کامل نحو و استفاده از تمامی ویژگی های زبان، کتاب Regular Expressions نوشته جی فریدل را توصیه می کنیم که در آن نحو به طور کامل پوشش داده شده است و نمونه هایی از عبارات منظم نه تنها در PHP، بلکه برای Python نیز وجود دارد. پرل، MySQL، جاوا، روبی و سی شارپ.

بررسی صحت آدرس ایمیل

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

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

بنابراین، عبارتی که اعتبار ایمیل را بررسی می کند باید شرایط زیر را بررسی کند:

  1. وجود علامت @ در رشته منبع و عدم وجود فاصله.
  2. قسمت دامنه آدرس، بعد از علامت @، فقط شامل کاراکترهای معتبر برای نام دامنه است. همین امر در مورد نام کاربری نیز صدق می کند.
  3. هنگام تأیید نام کاربری، لازم است وجود کاراکترهای خاص مانند آپوستروف یا آپستروف را تشخیص دهید. این کاراکترها بالقوه خطرناک هستند و می توانند در حملاتی مانند تزریق SQL قرار گیرند. از چنین آدرس هایی خودداری کنید.
  4. نام کاربری فقط یک نقطه را مجاز می‌کند که نمی‌تواند اولین یا آخرین کاراکتر در یک رشته باشد.
  5. نام دامنه باید شامل حداقل دو و حداکثر شش کاراکتر باشد.

نمونه ای که تمام این شرایط را در نظر می گیرد در شکل زیر قابل مشاهده است.

اعتبار سنجی URL ها

وظیفه.بررسی کنید که آیا یک رشته متن داده شده معتبر است یا خیر.

راه حل.نسخه نهایی ما به این صورت است:

/^(https?:\/\/)?([\da-z\.-]+)\.((2,6))([\/\w \.-]*)*\/?$ /

حال بیایید با استفاده از شکل، اجزای آن را با جزئیات بیشتری تجزیه و تحلیل کنیم.

بررسی شماره کارت اعتباری

وظیفه.لازم است تأیید صحت شماره کارت پلاستیکی وارد شده در رایج ترین سیستم های پرداخت انجام شود. گزینه فقط نقشه در نظر گرفته شده است

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

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

اکنون می توانید مستقیماً به بررسی شماره بروید. همه شرکت های کارت اعتباری از قالب شماره منحصر به فرد استفاده می کنند. مثال از این استفاده می کند و مشتری نیازی به وارد کردن نام شرکت ندارد - با شماره تعیین می شود. ویزا کارت ها همیشه با 4 شروع می شوند و 13 یا 16 رقمی هستند. MasterCard در محدوده 51-55 با طول عدد 16 شروع می شود. در نتیجه، عبارت زیر را دریافت می کنیم:

قبل از پردازش سفارش، می توانید آخرین رقم شماره را نیز بررسی کنید که با استفاده از الگوریتم Luhn محاسبه می شود.

بررسی شماره تلفن

وظیفه.بررسی صحت شماره تلفن وارد شده

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

+CCC.NNNNNNNNXEEEE،جایی که:

C یک کد کشور 1-3 رقمی است.

N - تعداد تا 14 رقم.

E یک پسوند اختیاری است.

علامت مثبت یک عنصر ضروری است و علامت x فقط زمانی وجود دارد که به پسوند نیاز باشد.

در نتیجه عبارت زیر را داریم:

^\+(1,3)\.(4,14)(?:x.+)?$

اعداد در یک محدوده

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

راه حل. در اینجا برخی از عبارات برای برخی از رایج ترین موارد وجود دارد:

جستجوی آدرس IP

وظیفه.باید تعیین کنید که آیا رشته داده شده یک آدرس IP معتبر در قالب IPv4 در محدوده 000.000.000.000-255.255.255.255 است یا خیر.

راه حل.مانند هر کار PHP، یک عبارت منظم دارای تغییرات زیادی است. به عنوان مثال، این:

بررسی آنلاین عبارات

بررسی صحت عبارات منظم می تواند برای برنامه نویسان تازه کار به دلیل پیچیدگی نحو، که با زبان های برنامه نویسی "عادی" متفاوت است، دشوار باشد. برای حل این مشکل، تست‌کننده‌های بیان آنلاین زیادی وجود دارند که بررسی درستی الگوی ایجاد شده روی متن واقعی را آسان می‌کنند. برنامه نویس یک عبارت و داده را برای تأیید وارد می کند و فوراً نتیجه پردازش را می بیند. معمولاً یک بخش مرجع نیز وجود دارد که عبارات منظم، مثال‌ها و تفاوت‌های پیاده‌سازی رایج‌ترین زبان‌های برنامه‌نویسی را با جزئیات شرح می‌دهد.

اما اعتماد کامل به نتایج خدمات آنلاین برای همه توسعه دهندگانی که از PHP استفاده می کنند توصیه نمی شود. یک عبارت منظم نوشته شده و شخصاً تست شده مهارت ها را بهبود می بخشد و تضمین می کند که هیچ خطایی وجود ندارد.