به بهانه یه کد خیلی ساده برای wrap کردن کدهای embed آپارات، یکم ریجکس یاد بگیریم... (یا شاید مرور کنیم)
بذار خیلی ساده توضیح بدم که این کد چیکار میکنه و ریجکس (Regular Expression) اصلاً چیه و چرا استفاده شده.
ریجکس یه ابزار یا بهتر بگم یه سیستم نوشتاری برای تعریف الگوها توی متنهاست. این ابزار یه سری قواعد و سینتکس (syntax) داره که شبیه یه زبان کوچیک عمل میکنه. توش میتونی با استفاده از کاراکترهای خاص و قوانینش، به کامپیوتر بگی: “برو این الگو رو توی متن پیدا کن.”
این کدی که نوشتم، یه متن ورودی (یه رشته یا همون string) رو میگیره و میگرده دنبال یه تگ خاص که شبیه اینه:
<div id="14258897965"><script type="text/JavaScript" src="https://www.aparat.com/embed/..."></script></div>وقتی پیداش کرد، میاد این تگ رو میپیچه توی یه تگ دیگه به این شکل:
<div class="raw-html-embed">
<div id="14258897965"><script type="text/JavaScript" src="https://www.aparat.com/embed/..."></script></div>
</div>$pattern = '/<div id="\d+"><script type="text\/JavaScript" src="https:\/\/www\.aparat\.com\/embed\/[^"]+"><\/script><\/div>/';اینجا ریجکس رو تعریف کردیم. این الگو میگه دنبال چی بگرده. بذار خط به خط توضیح بدم:
/ ... /: ریجکس همیشه بین دو تا اسلش میاد.<div id="\d+">: دنبال یه<div>میگرده کهidداره و مقدارش یه عدد هست.\d+: یعنی "هر تعدادی عدد پشت سر هم".
<script type="text\/JavaScript" src="https:\/\/www\.aparat\.com\/embed\/[^"]+">: دنبال یه تگ<script>میگرده که:typeش برابرtext/JavaScriptباشه.srcش یه لینکه که باhttps://www.aparat.com/embed/شروع میشه.[^"]+: یعنی "هر چیزی که داخلsrcهست، تا وقتی که به علامت"برسه".
<\/script><\/div>: آخرش هم تگ<script>و بعدش تگ<div>بسته میشه.
$replacement = '<div class="raw-html-embed">$0</div>';اینجا میگیم وقتی اون الگو رو پیدا کردی، اونو اینجوری جایگزین کن:
<div class="raw-html-embed">: یه تگ جدید باز کن.$0: کل همون چیزی که پیدا کردی (یعنی همون تگ<div>و محتویاتش) رو بذار اینجا.</div>: بعدش تگ جدید رو ببند.
$output = preg_replace($pattern, $replacement, $input);preg_replace: این تابع میاد توی متن ورودی ($input) میگرده دنبال چیزایی که با الگوی ریجکس ($pattern) مطابقت دارن و اونا رو با چیزی که توی$replacementتعریف کردیم، جایگزین میکنه.- خروجی این تابع میشه متن تغییر دادهشده.
return $output;اینجا متن جدید رو برمیگردونیم.
$input = 'سلام
<p>این یک چپتر است</p>
<div id="14258897965"><script type="text/JavaScript" src="https://www.aparat.com/embed/tfhka94?data[rnddiv]=14258897965&data[responsive]=yes"></script></div>
<p>شماره را چه شده است؟</p>';
$result = wrapSpecificDiv($input);
echo $result;$input: این متن اصلیه که میخوای روش کار کنی.wrapSpecificDiv($input): تابع رو صدا میزنی و متن جدید رو میگیری.echo $result: متن جدید رو چاپ میکنی.
ورودی:
سلام
<p>این یک چپتر است</p>
<div id="14258897965"><script type="text/JavaScript" src="https://www.aparat.com/embed/tfhka94?data[rnddiv]=14258897965&data[responsive]=yes"></script></div>
<p>شماره را چه شده است؟</p>خروجی:
سلام
<p>این یک چپتر است</p>
<div class="raw-html-embed"><div id="14258897965"><script type="text/JavaScript" src="https://www.aparat.com/embed/tfhka94?data[rnddiv]=14258897965&data[responsive]=yes"></script></div></div>
<p>شماره را چه شده است؟</p>- تمیز و قابل فهمه: فقط یه تابع داری که متن رو میگیره و تغییر میده.
- ریجکس خیلی قدرتمنده: میتونی با یه الگوی دقیق، دقیقاً همون چیزی که میخوای رو پیدا کنی.
- قابل گسترشه: اگه بعداً بخوای الگو رو تغییر بدی یا چیزای دیگهای رو هم پیدا کنی، فقط کافیه ریجکس رو آپدیت کنی.
ریجکس اولش ممکنه سخت به نظر بیاد، ولی وقتی بفهمی چطوری کار میکنه، عاشقش میشی. برای شروع میتونی از ابزارهای آنلاین مثل regex101 استفاده کنی. این سایت بهت نشون میده که ریجکس چطوری کار میکنه و کدوم بخشهای متن رو پیدا میکنه.
حالا با همین توضیحاتی که دادم، برو یه نگاه به ریجکس بنداز و ببین چقدر راحت میتونی الگوها رو پیدا کنی!