• عبارات منظم (الگوها). عبارات منظم عبارات منظم php or

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

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

    جدول شخصیت های خاص

    شخصیت خاص شرح
    \ نماد فرار مثال: "/seo\/smo/"- با خطی که حاوی seo/smo است مطابقت دارد.
    ^ شروع نماد داده مثال: "/^ SEO/"- با خطی که با کلمه seo شروع می شود مطابقت دارد.
    $ نماد پایان داده مثال: "/blog$/"- با خطی مطابقت دارد که با کلمه وبلاگ خاتمه می یابد.
    . هر کاراکتری غیر از فید خط. مثال: "/seo.ult/"- با رشته seopult، seo9ult، seo@ult و غیره مطابقت دارد.
    در داخل این براکت ها کاراکترهایی فهرست شده است که هر یک از آنها می توانند در یک مکان مشخص ظاهر شوند، اما فقط یکی. مثال: "/سئولت/"- فقط خطوط حاوی 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 // کلمه ای را پیدا کنید که در آن ing بعد از Box آمده باشد. اگر کلمه پیدا شود، تابع 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، "جعبه برای 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 = آرایه () ; // آرایه ای از پیوندهای خارجی 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 ; ) آرایه بازگشت () ; ) $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 را از یک رشته حذف می کند.
    اندازه- تعداد عناصر موجود در متغیر را بدست می آورد.
    شمردن- تعداد عناصر آرایه یا تعداد خصوصیات شی را می شمارد.

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

    قوانین ایجاد یک الگو

    مرزهای الگو باید با نمادهای خاصی مشخص شوند، اغلب با استفاده از " / "، اما من ترجیح می دهم استفاده کنم" # "چون فراوانی اسلش های رو به جلو و عقب می تواند چشمان شما را خیره کند و علائم هش معمولاً در هیچ جای دیگری استفاده نمی شود. بنابراین: " #HereBodyRegularExpression#"

    پرانتزها در داخل یک عبارت منظم استفاده می شوند - اینها عبارت های فرعی هستند که می توانند دستکاری شوند، به عنوان مثال:

    #^/catalog/(+)/(+)\.html.*#

    این عبارت برای دریافت پارامترها در یک رشته طراحی شده است URL. در ابتدای خط یک کاراکتر خاص وجود دارد " ^ "- این به معنای ابتدای خط است. بعد می آید" /کاتالوگ/" - اینجا هیچ کاراکتر خاصی وجود ندارد، این فقط متنی است که باید در خط باشد. سپس با پرانتز مواجه شدیم، یعنی به اولین عبارت فرعی رسیدیم. براکت های مربع نشان دهنده بسیاری از کاراکترهایی است که می توانند در این مکان در خط باشند. علامت " - "یعنی شمارش. علامت" \ " از کاراکترهای خاص فرار می کند. بنابراین، در اولین عبارت فرعی می توانیم CAPITAL و حروف کوچک الفبای لاتین، اعداد از 0 تا 9، یک خط زیر، یک خط تیره و یک نقطه را داشته باشیم. یک خط تیره و یک نقطه کاراکترهای خاص هستند، اما در اینجا آنها فرار شده اند، بنابراین در اینجا فقط نمادها هستند. بعد از پرانتز مربع یک " وجود دارد + " - این بدان معنی است که کاراکتر قبلی (و برای ما مجموعه ای از کاراکترهای مشخص شده در پرانتز است) می تواند 1 بار یا بیشتر ظاهر شود. سپس می آید " / "فقط یک نماد، و یک عبارت فرعی مشابه است. سپس می آید" \.html"متن به چه معناست" .html". و سپس شخصیت های خاص" .* "نقطه به معنای هر کاراکتر، و ستاره به معنای هر مقدار از کاراکتر قبلی است. یعنی بعد از" .html"هر چیزی ممکن است برود.

    نشان کمیت، کمیت سازها

    در بالا قبلاً چنین نمادهایی را در نظر گرفته ایم که نشان دهنده تعداد نمادهای قبلی است، مانند + و * . در اینجا تمام احتمالات برای تعیین مقدار وجود دارد:

    شخصیت های خاص

    برای برخی از گروه های شخصیت اختصارات خاصی وجود دارد:

    "طمع"

    بیایید به مفهوم حرص و آز بیان منظم نگاه کنیم. به عنوان مثال یک خط وجود دارد:

    #()#

    می خوانیم: subexpression:

    به نظر می رسد همه چیز درست است، عبارت فرعی مناسب است:

    اما همچنین مناسب است:

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

    #() #U

    اصلاح کننده ها

    یک عبارت منظم را می توان با اصلاح کننده ها دنبال کرد: " #HereBodyRegularExpression#HereModifiers"انواع اصلاح کننده:

    من حالت حساس به حروف کوچک و بزرگ را فعال می کند، یعنی حروف بزرگ و کوچک در عبارت تفاوتی ندارند.
    متر نشان می دهد که متن مورد جستجو باید به عنوان متشکل از چندین خط در نظر گرفته شود. به طور پیش‌فرض، موتور عبارت منظم، متن را بدون توجه به اینکه واقعاً چیست، به عنوان یک رشته واحد در نظر می‌گیرد. بر این اساس، فراکاراکترها "^" و "$"ابتدا و انتهای کل متن را نشان می دهد. اگر این اصلاح کننده مشخص شده باشد، به ترتیب ابتدا و انتهای هر خط متن را نشان می دهند.
    س متاکاراکتر پیش فرض " . " یک کاراکتر خط جدید را در تعریف خود شامل نمی شود. با مشخص کردن این اصلاح کننده، این محدودیت حذف می شود.
    U حرص بیان منظم را از بین می برد
    تو عبارات منظم را برای کار با آنها فعال می کند سیریلیک به UTF-8، در غیر این صورت درست کار نمی کند.

    php توابع برای کار با عبارات منظم

    preg_replace

    جستجو و جایگزینی:

    Preg_replace (مخلوط $pattern، مختلط $جایگزینی، مختلط $subject [، int $limit = -1 [، int &$count ]]);

    هر مقدار می تواند یک رشته یا یک آرایه باشد موضوع $آرایه - یک آرایه برگردانده می شود، در غیر این صورت یک رشته

    preg_split

    یک رشته را با استفاده از یک عبارت منظم تقسیم می کند:

    Preg_split (رشته $pattern، رشته $subject [، int $limit = -1 [، int $flags = 0 ]]);

    آرایه ای متشکل از زیر رشته های رشته داده شده را برمی گرداند موضوع، که در امتداد مرزهای مربوط به الگو تقسیم شده است الگو.

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

    توسعه سریع اینترنت و زبان های توسعه وب مستلزم ایجاد ابزارهای جهانی و فشرده برای پردازش اطلاعات متنی با حداقل مقدار کد مورد نیاز برای این کار است. زبان 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)

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

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

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

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

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

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

    2. + - یک یا چند تکرار، به عنوان مثال،).

    3.؟ - صفر یا فقط یک تکرار - (0،1).

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

    برای کسانی که عبارات منظم را یاد می گیرند، مثال ها بهترین آموزش هستند. ما تعدادی را ارائه خواهیم داد که با حداقل تلاش توانایی های گسترده خود را نشان می دهند. همه کدهای برنامه کاملاً با نسخه های PHP 4.x و بالاتر سازگار هستند. برای درک کامل نحو و استفاده از تمام ویژگی‌های زبان، کتاب جی فریدل با عنوان «قاعده عبارات» را توصیه می‌کنیم که به طور کامل در مورد نحو بحث می‌کند و شامل نمونه‌هایی از عبارات منظم نه تنها در PHP، بلکه برای Python، Perl، MySQL، جاوا، روبی و سی شارپ.

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

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

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

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

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

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

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

    وظیفه.بررسی کنید که آیا یک رشته متن داده شده معتبر است یا نه یک بار دیگر، بررسی 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 استفاده می کنند توصیه نمی شود. یک عبارت منظم که شخصاً نوشته و آزمایش شده است، مهارت شما را بهبود می بخشد و عدم وجود خطا را تضمین می کند.

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

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

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

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

    بیایید با چند مثال ساده شروع کنیم. اولین عبارت در تصویر زیر به دنبال دنباله ای از 3 حرف است، که در آن حرف اول "k"، دومی هر حرف روسی و سومی "t" به بزرگی و کوچکی حساس نیست (به عنوان مثال، "cat" یا "KOT" ” متناسب با این الگو). عبارت دوم متن را برای زمان در قالب 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 می گردد.

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

    بیکس اسلش

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

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

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

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

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

    طرح های خاص در فصل عادی

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

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

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

    • نحو عبارت منظم در PHP، توضیحات مفصل

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

    مقدمه ای بر عبارات با قاعده

    هنگامی که برای اولین بار با عبارات منظم آشنا می شوند، ممکن است درک و استفاده از آنها دشوار به نظر برسد. در واقع همه چیز ساده تر از چیزی است که به نظر می رسد. قبل از اینکه به مثال های پیچیده نگاه کنیم، بیایید به اصول اولیه نگاه کنیم:

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

    تایید دامنه

    بررسی نام دامنه صحیح

    $url = "http://example.com/"; if (preg_match("/^(http|https|ftp)://(*(?:.*)+):?(d+)?/?/i، $url)) ( echo "Ok."; ) else ( «نشانی اینترنتی اشتباه است.»؛ )

    برجسته کردن کلمات در متن

    یک عبارت منظم بسیار مفید برای . برای جستجو مفید است.

    $text = "جمله نمونه، regex در برنامه نویسی وب رایج شده است. اکنون regex را یاد می گیریم. طبق ویکی پدیا، عبارات منظم (به اختصار regex یا regexp، با اشکال جمع regexes، regexps یا regexen) به یک زبان رسمی نوشته می شوند که می تواند توسط یک پردازشگر عبارت منظم تفسیر شود"؛ $text = preg_replace("/b(regex)b/i"، " 1"، $text)؛ echo $text;

    برجسته شدن نتایج جستجو در وردپرس

    همانطور که قبلا ذکر شد، مثال قبلی بسیار مفید است. بیایید آن را در وردپرس اعمال کنیم. فایل را باز کنید search.phpتابع را پیدا کنید عنوان().آن را با موارد زیر جایگزین کنید:

    Echo $title;

    حالا قبل از این خط کد را وارد کنید:

    \0"، $title); ?>

    فایل را باز کنید style.css. خط را به آن اضافه کنید:

    Strong.search-excerpt ( پس زمینه: زرد؛ )

    همه تصاویر را از یک سند HTML دریافت کنید

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

    $images = array(); preg_match_all("/(img|src)=("|")[^"">]+/i", $data, $media); unset($data); $data=preg_replace("/(img|src)("|"|="|=")(.*)/i","$3",$media); foreach($data as $url) ($info = pathinfo($url); if (isset($info["extension"])) ( if (($info["extension"] == "jpg") || ($info["extension"] == "jpeg") || ($info["extension"] == "gif") || ($info["extension"] == "png")) array_push($ تصاویر، $url); ))

    حذف کلمات تکراری (مستقل از حروف کوچک)

    $text = preg_replace("/s(w+s)1/i"، "$1"، $text);

    حذف علائم نگارشی تکراری

    مشابه قبلی است، اما علائم نگارشی را حذف می کند.

    $text = preg_replace("/.+/i"، "."، $text);

    پیدا کردن یک تگ XML/HTML

    یک تابع ساده که دو آرگومان دارد: برچسبی که باید پیدا شود و یک رشته حاوی XML یا HTML.

    تابع get_tag($tag، $xml) ($tag = preg_quote($tag); preg_match_all("(<".$tag."[^>]*>(.*?)")"، $xml، $matches، PREG_PATTERN_ORDER); بازگشت $matches;

    یافتن یک تگ XML/HTML با یک مقدار مشخصه خاص

    تابع مشابه قبلی است، اما می توان یک ویژگی برچسب را مشخص کرد. مثلا:

    .

    تابع get_tag($attr، $value، $xml، $tag=null) ( if(is_null($tag)) $tag = "\w+"؛ در غیر این صورت $tag = preg_quote($tag)؛ $attr = preg_quote($ attr)؛ $value = preg_quote ($value)؛ $tag_regex = "/<(".$tag.")[^>]*$attr\s*=\s*". "(["\"])$value\\2[^>]*>(.*?)<\/\\1>/" preg_match_all($tag_regex، $xml، $matches، PREG_PATTERN_ORDER)؛ بازگشت $matches؛ )

    پیدا کردن کدهای رنگ هگز

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

    $string = "#555555"; if (preg_match("/^#(?:(?:(3))(1,2))$/i"، $string)) ( echo "مثال 6 موفقیت آمیز."؛ )

    پیدا کردن عنوان صفحه

    این کد متن بین تگ ها را پیدا کرده و نمایش می دهد </i>و <i> صفحات HTML

    $fp = fopen("http://www.catswhocode.com/blog"،"r"); while (!feof($fp))($page .= fgets($fp, 4096); ) $titre = eregi(" (.*)",$page,$regs); echo $regs; fclose($fp);

    تجزیه لاگ های آپاچی

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

    //Logs: وب سرور آپاچی // دسترسی های موفقیت آمیز به فایل های html. برای شمارش برداشت های صفحه مفید است. "^((?# IP یا نام دامنه مشتری)S+)s+((?#تأیید هویت پایه)S+s+S+)s+[((?#تاریخ و زمان)[^]]+)]s+"(?: GET|POST|HEAD) ((?#file)/[^ ?]+?.html?)??((?#parameters)[^ ?]+)? HTTP/+"s+(?#کد وضعیت)200s+((?#بایت منتقل شد)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#عامل کاربر )[^"]*)"$" //Logs: وب سرور آپاچی //404 خطاهای "^((?#IP یا نام دامنه مشتری)S+)s+((?#اصالت‌سنجی اولیه)S+s+S+)s+ [((?#تاریخ و زمان)[^]]+)]s+"(?:GET|POST|HEAD) ((?#file)[^ ?]+)??((?#پارامترها)[^ ? "]+)؟ HTTP/+"s+(?#کد وضعیت)404s+((?#بایت منتقل شد)[-0-9]+)s+"((?#ارجاع)[^"]*)"s+"((?#عامل کاربر )[^"]*)"$")

    جایگزینی نقل قول های دوگانه با نقل قول های فرفری

    preg_replace("B"b([^"x84x93x94rn]+)b"B"، "?1?"، $text);

    بررسی پیچیدگی رمز عبور

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

    "A(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*؟) [-_a-zA-Z0-9](6،)z"

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

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

    پست_محتوا؛ $szSearchPattern = "~ ]* />~"؛ // اجرای preg_match_all برای گرفتن همه تصاویر و ذخیره نتایج در $aPics preg_match_all($szSearchPattern, $szPostContent, $aPics); // بررسی کنید که آیا حداقل 1 تصویر داریم $iNumberOfPics = count($aPics); if ($iNumberOfPics > 0) ( // اکنون در اینجا هر کاری را که باید با تصاویر انجام دهید انجام می دهید // برای این مثال، تصاویر فقط برای ($i=0; $i) نمایش داده می شوند< $iNumberOfPics ; $i++) { echo $aPics[$i]; }; }; endwhile; endif; ?>

    تبدیل شکلک ها به عکس

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

    $texte="متن با شکلک:-)"; echo str_replace(":-)"،" ",$texte);