استفاده از عبارت‌های منظم در php با کمک دو کتابخانه‌ی درونی امکان‌پذیر است. کتابخانه‌ی اول که از مدل POSIX پیروی می‌کند و شامل تابع‌های ereg، ereg_replace، split و ... است و کتابخانه‌ی دوم که از مدل PERL پیروی می‌کند و شامل تابع‌های preg_match، preg_replace، preg_split و ... می‌شود.
استفاده از سری توابع POSIX در نسخه‌های جدید php منسوخ شده است و توصیه شده تا برنامه‌نویسان از کتابخانه‌ی PERL استفاده کنند.

تلاش می‌کنیم با چند مثال ساده، شیوه‌ی استفاده از عبارت‌های منظم در php با استفاده از کتابخانه‌ی PCRE یا سازگار با PERL را مرور کنیم.

برای آشنایی با Regular Expression یا عبارت منظم، اینجا کلیک کنید

preg_match

ساده‌ترین شکل استفاده از عبارت‌های منظم، عمل جستجو است که این تابع انجام آن را بر عهده دارد.
دو پارامتر ابتدایی این تابع اجباری هستند که به ترتیب «عبارت منظم» و «رشته‌ی هدف» را مشخص می‌کنند. برای مثال به نمونه کد زیر توجه کنید:

<?php
	$found = preg_match( '/amib/', 'https://amib.ir/weblog' );
	echo $found; // عدد ۱ را در خروجی نشان می‌دهد
?>

مقدار خروجی این تابع عدد «۰» یا «۱» به معنی پیدا نشدن یا پیدا شدن عبارت مورد جستجو است. استفاده از علامت ممیز«/» قبل و بعد از عبارت منظم اجباری است.

به مثال بعدی دقت کنید:

<?php
	$found = preg_match( '/https?:\/\//', 'https://amib.ir/weblog' );
	echo $found; // عدد ۱ را در خروجی نشان می‌دهد
?>

عبارت منظم به کار رفته در مثال بالا برای یافتن «‎https://‎» یا «‎http://‎» استفاده می‌شود. برای به کارگیری علامت ممیز «/» داخل عبارت منظم، لازم است تا آن را با ممیزوارو «\» پیشوند کنید. علامت سوال «?» پس از حرف «s» به معنی اختیاری بودن آن است.

در مثال بعدی از علامت Caret «^» و نشان دلار «$» به معنی ابتدا و انتهای خط استفاده می‌کنیم:

<?php
	$found = preg_match( '/^09[123]\d{8}$/', '09391234567' );
	echo $found; // عدد ۱ را در خروجی نشان می‌دهد
?>

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

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

preg_replace

تابع مفید بعدی preg_replace است که وظیفه‌ی جستجو با کمک عبارت منظم و جایگزین کردن را بر عهده دارد. در هنگام جایگزین کردن می‌توان از متغیرهای تعریف شده در عبارت منظم استفاده کرد. به مثال زیر توجه کنید:

<?php
	$hide_mobile = preg_replace( '/09[123]\d{8}/', '****', 'Mobile: 09391234567' );
	echo $hide_mobile; // Mobile: ****
?>

کد بالا عبارت مقابل خود را برای شماره‌ی موبایل جستجو می‌کند و آن را با چهار ستاره «****» جایگزین می‌کند.
برای تعریف متغیر درون عبارت منظم و استفاده از آن در رشته‌ی جایگزین، بخش مورد نظر را داخل پرانتز قرار می‌دهیم و به ترتیب با «‎$1‎»، «‎$2‎» و ... آن‌ها را فراخوانی می‌کنیم:

<?php
	$add_code_to_mobile = preg_replace( '/0(9[123]\d{8})/', '+98$1', 'Mobile: 09391234567' );
	echo $add_code_to_mobile; // Mobile: +989391234567
?>

کد بالا رشته‌ی مقابل خود را برای یافتن شماره‌ی موبایل بدون کد کشور جستجو می‌کند، شماره‌های قرار گرفته مقابل «0» را در پرانتز قرار می‌دهد تا متغیری از آن بسازد و سپس شماره‌ی یافته شده را با عبارت «‎+98$1‎» جایگزین می‌کند. دقت کنید که عبارت «‎$1‎» پس از «‎+98‎» به معنی اولین متغیر تعریف شده در عبارت منظم است.

۱۴ نظر در مورد «عبارت‌های منظم در php»

  • دادا دمت گرم استفاده بردم مرسی. فقط یک سوال :
    اگر با file_get_contents اطلاعات یک سایت را گرفته و با تابع preg_match یک table از آنرا جدا کنم تو سایت نمایش بدم عیب های این روش چیه از پهنای باند گرفته تا گوگل آنالیز چه مشکلاتی داره ممنون میشم میل بزنی مرسی

    • امیرمسعود ایرانی می‌گوید:

      سلام

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

      اشکالی که ممکن است به وجود آید تغییر در سایت مبدا و نمایش محتوای ناخواسته در سایت شماست
      از نظر فنی مشکل دیگری به ذهنم نمی‌رسد

  • سلام يه سوال دارم
    يه تابع ميخوام كه به قبل و بعد از تگ خاص يه تگ ديگه اضافه كنه
    مثلا به قبل و بعد تمام img ها يه p اضافه كنه
    من براي حايگزيني از تابع شما استفاده كرئم ولي نتيجه نداد و هر چند تابع درست بود اما به هدفم نرسيدم

    $html = preg_replace('![ \r\n\s]*!', '', $html);

    حالا شما اون تابعي رو كه گفتم به زحمت معرفي كنيد

    • امیرمسعود ایرانی می‌گوید:

      سلام

      کدی شبیه کد زیر باید مشکل شما رو حل کنه
      ( کد تست نشده )

      <?php
      $html = preg_replace( '/(<img[^>]+>)/', '<p>$1</p>', $html );
      ?>
        • امیرمسعود ایرانی می‌گوید:

          سلام

          <?php
          $html = preg_replace( '/(<img[^>]+?id="test"[^>]+>)/', '<p>$1</p>', $html );
          ?>

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

  • با تشکر از سایت خوبتان
    مخصوصا preg_match خوب توضیح دادید.
    ولی من یک فایل txt دارم و در داخل اون چند تا ip هست و در داخل اون رشته هم وجود داره
    من دنبال یه تابع می گردم که همه ip را جدا کنه و بهم نشون بده ؟
    اگه راهنمایی کنید ممنون می شم.

  • اما سواله دیگه دارم
    من این چند تا ip را داخل یک فایل دارم و می خوام ip های تکراری حذف شوند. منتها نمی دانم از چه تابعی استفاده کنم ؟

    • امیرمسعود ایرانی می‌گوید:

      اگر IPها هر کدام در یک خط ذخیره شده باشند، با استفاده از اکسل و دستور Remove Duplicates می‌توانید موارد تکراری را حذف کنید
      لطفا برای گفتگو در مورد موارد غیرمرتبط با موضوع وبلاگ از ایمیل استفاده کنید

    • امیرمسعود ایرانی می‌گوید:

      با سلام

      با فرض استفاده از موتور پردازش php که از سیستم ascii استفاده می‌کنه و فرض ذخیره‌سازی متن به صورت utf-8، باید از تشخصیص حروف uft-8 استفاده کنید.
      مشخص کردن دامنه‌ی حروف فارسی در utf-8 با کمک عبارت‌های منظم، نسبتا پیچیده خواهد بود و در حال حاضر من این کد رو به صورت آماده ندارم.
      باید مقداری جستجو کنید تا اگر کسی قبلا این کدها را آماده کرده از آن استفاده کنید وگرنه با مطالعه‌ی این مطلب، خودتان زحمت نوشتن آن را بکشید

دیدگاهتان را بنویسید

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