Skip to content

Instantly share code, notes, and snippets.

@Mehrdad-Dadkhah
Created January 19, 2025 04:51
Show Gist options
  • Select an option

  • Save Mehrdad-Dadkhah/f75ae3a17bec9049f2edcfcb1e57363c to your computer and use it in GitHub Desktop.

Select an option

Save Mehrdad-Dadkhah/f75ae3a17bec9049f2edcfcb1e57363c to your computer and use it in GitHub Desktop.
آموزش خیلی مختصر ریجکس - regex

به بهانه یه کد خیلی ساده برای 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>

خط به خط کد رو توضیح می‌دم:

1. نوشتن الگوی ریجکس:

$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> بسته می‌شه.

2. تعریف چیزی که جایگزین می‌کنیم:

$replacement = '<div class="raw-html-embed">$0</div>';

اینجا می‌گیم وقتی اون الگو رو پیدا کردی، اونو اینجوری جایگزین کن:

  • <div class="raw-html-embed">: یه تگ جدید باز کن.
  • $0: کل همون چیزی که پیدا کردی (یعنی همون تگ <div> و محتویاتش) رو بذار اینجا.
  • </div>: بعدش تگ جدید رو ببند.

3. پیدا کردن و جایگزینی:

$output = preg_replace($pattern, $replacement, $input);
  • preg_replace: این تابع میاد توی متن ورودی ($input) می‌گرده دنبال چیزایی که با الگوی ریجکس ($pattern) مطابقت دارن و اونا رو با چیزی که توی $replacement تعریف کردیم، جایگزین می‌کنه.
  • خروجی این تابع می‌شه متن تغییر داده‌شده.

4. برگردوندن نتیجه:

return $output;

اینجا متن جدید رو برمی‌گردونیم.


5. استفاده از تابع:

$input = 'سلام
<p>این یک چپتر است</p>
<div id="14258897965"><script type="text/JavaScript" src="https://www.aparat.com/embed/tfhka94?data[rnddiv]=14258897965&#038;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&#038;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&#038;data[responsive]=yes"></script></div></div>
<p>شماره را چه شده است؟</p>

چرا این کد خوبه؟

  1. تمیز و قابل فهمه: فقط یه تابع داری که متن رو می‌گیره و تغییر می‌ده.
  2. ریجکس خیلی قدرتمنده: می‌تونی با یه الگوی دقیق، دقیقاً همون چیزی که می‌خوای رو پیدا کنی.
  3. قابل گسترشه: اگه بعداً بخوای الگو رو تغییر بدی یا چیزای دیگه‌ای رو هم پیدا کنی، فقط کافیه ریجکس رو آپدیت کنی.

یه نکته برای یادگیری ریجکس:

ریجکس اولش ممکنه سخت به نظر بیاد، ولی وقتی بفهمی چطوری کار می‌کنه، عاشقش می‌شی. برای شروع می‌تونی از ابزارهای آنلاین مثل regex101 استفاده کنی. این سایت بهت نشون می‌ده که ریجکس چطوری کار می‌کنه و کدوم بخش‌های متن رو پیدا می‌کنه.

حالا با همین توضیحاتی که دادم، برو یه نگاه به ریجکس بنداز و ببین چقدر راحت می‌تونی الگوها رو پیدا کنی!

<?php
function wrapSpecificDiv($input) {
// الگوی منظم برای شناسایی تگ <div> مورد نظر
$pattern = '/<div id="\d+"><script type="text\/JavaScript" src="https:\/\/www\.aparat\.com\/embed\/[^"]+"><\/script><\/div>/';
// تابع جایگزینی که تگ را با نسخه رپ‌شده جایگزین می‌کند
$replacement = '<div class="raw-html-embed">$0</div>';
// استفاده از preg_replace برای جایگزینی
$output = preg_replace($pattern, $replacement, $input);
return $output;
}
// نمونه متن ورودی
$input = 'سلام
<p>این یک چپتر است</p>
<div id="14258897965"><script type="text/JavaScript" src="https://www.aparat.com/embed/tfhka94?data[rnddiv]=14258897965&#038;data[responsive]=yes"></script></div>
<p>شماره را چه شده است؟</p>';
// اجرای تابع
$result = wrapSpecificDiv($input);
// چاپ نتیجه
echo $result;
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment