استفاده از عبارتهای منظم در 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/', 'http://amib.ir/weblog' ); echo $found; // عدد ۱ را در خروجی نشان میدهد ?> |
مقدار خروجی این تابع عدد «۰» یا «۱» به معنی پیدا نشدن یا پیدا شدن عبارت مورد جستجو است. استفاده از علامت ممیز«/» قبل و بعد از عبارت منظم اجباری است.
به مثال بعدی دقت کنید:
<?php $found = preg_match( '/https?:\/\//', 'http://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 ?> |
کد بالا رشتهی مقابل خود را برای یافتن شمارهی موبایل بدون کد کشور جستجو میکند، شمارههای قرار گرفته مقابل «۰» را در پرانتز قرار میدهد تا متغیری از آن بسازد و سپس شمارهی یافته شده را با عبارت «+98$1» جایگزین میکند. دقت کنید که عبارت «$1» پس از «+98» به معنی اولین متغیر تعریف شده در عبارت منظم است.
دادا دمت گرم استفاده بردم مرسی. فقط یک سوال :
اگر با file_get_contents اطلاعات یک سایت را گرفته و با تابع preg_match یک table از آنرا جدا کنم تو سایت نمایش بدم عیب های این روش چیه از پهنای باند گرفته تا گوگل آنالیز چه مشکلاتی داره ممنون میشم میل بزنی مرسی
سلام
هرچند پرسش شما مستقیما به این نوشته مرتبط نیست
این کار را خیلی از سایتهای مخصوصا داخلی انجام میدهند و از محتوای دیگران در سایت خود کپی تهیه میکنند
اشکالی که ممکن است به وجود آید تغییر در سایت مبدا و نمایش محتوای ناخواسته در سایت شماست
از نظر فنی مشکل دیگری به ذهنم نمیرسد
آقای ایرانی خیلی پر بار بود-ممنون همکلاسی..
خواهش میکنم. لطف دارید
سلام یه سوال دارم
یه تابع میخوام که به قبل و بعد از تگ خاص یه تگ دیگه اضافه کنه
مثلا به قبل و بعد تمام img ها یه p اضافه کنه
من برای حایگزینی از تابع شما استفاده کرئم ولی نتیجه نداد و هر چند تابع درست بود اما به هدفم نرسیدم
حالا شما اون تابعی رو که گفتم به زحمت معرفی کنید
سلام
کدی شبیه کد زیر باید مشکل شما رو حل کنه
( کد تست نشده )
خیلی ممنون داداش
حالا اگر بخوام فقط یه کلاس یا آی دی خاص ار img رو بگیره چی؟
سلام
با توجه به اینکه مشکل شما به موضوع این نوشته مربوط نیست لطفا در صورت حل نشدن مشکل، از طریق ایمیل گفتگو رو ادامه بدید
با تشکر
با تشکر از سایت خوبتان
مخصوصا preg_match خوب توضیح دادید.
ولی من یک فایل txt دارم و در داخل اون چند تا ip هست و در داخل اون رشته هم وجود داره
من دنبال یه تابع می گردم که همه ip را جدا کنه و بهم نشون بده ؟
اگه راهنمایی کنید ممنون می شم.
با سلام و تشکر
خدمت شما:
اما سواله دیگه دارم
من این چند تا ip را داخل یک فایل دارم و می خوام ip های تکراری حذف شوند. منتها نمی دانم از چه تابعی استفاده کنم ؟
اگر IPها هر کدام در یک خط ذخیره شده باشند، با استفاده از اکسل و دستور Remove Duplicates میتوانید موارد تکراری را حذف کنید
لطفا برای گفتگو در مورد موارد غیرمرتبط با موضوع وبلاگ از ایمیل استفاده کنید
با سلام و تشکر از سایت خوبتون
در مورد محدود کردن کاراکتر فارسی مثلا(نام) چطوری میشه؟
با سلام
با فرض استفاده از موتور پردازش php که از سیستم ascii استفاده میکنه و فرض ذخیرهسازی متن به صورت utf-8، باید از تشخصیص حروف uft-8 استفاده کنید.
مشخص کردن دامنهی حروف فارسی در utf-8 با کمک عبارتهای منظم، نسبتا پیچیده خواهد بود و در حال حاضر من این کد رو به صورت آماده ندارم.
باید مقداری جستجو کنید تا اگر کسی قبلا این کدها را آماده کرده از آن استفاده کنید وگرنه با مطالعهی این مطلب، خودتان زحمت نوشتن آن را بکشید