Regular Expressions

🟦 1. ما هي Regular Expressions (التعبيرات النمطية)؟

التعريف:
التعبيرات النمطية هي “أنماط” تُستخدم لمطابقة أو البحث أو التحقق من أجزاء من النصوص. تُستخدم بكثرة في التحقق من المدخلات، مثل البريد الإلكتروني، أرقام الهواتف، كلمات المرور… إلخ.

🔸 مثال:
هل تحتوي الجملة على كلمة “php”؟

$text = "I love PHP!";
if (preg_match("/php/i", $text)) {
    echo "نعم، الكلمة موجودة!";
}
PHP

✅ استخدمنا /php/i:

  • php هو النص الذي نبحث عنه.
  • i تعني “تجاهل حالة الأحرف” (PHP أو php أو Php كلها مقبولة).
🟦 2. أنواع Regular Expressions في PHP
🔹 POSIX (قديمة):
ereg() و eregi() // تم حذفها منذ PHP 7
PHP
✅ PCRE (الحديثة والأفضل):

تبدأ بـ preg_ مثل:

  • preg_match()
  • preg_replace()
  • preg_split()
🟦 3. الدوال الأساسية
🔸 preg_match() – هل هناك تطابق واحد؟
$string = "Email: [email protected]";
if (preg_match("/\w+@\w+\.\w+/", $string)) {
    echo "يوجد بريد إلكتروني";
}
PHP
🔸 preg_match_all() – تطابقات متعددة
$text = "PHP, HTML, CSS, JavaScript";
preg_match_all("/\w+/", $text, $matches);
print_r($matches);
PHP
🔸 preg_replace() – استبدال نص
$text = "أنا أحب PHP";
echo preg_replace("/PHP/", "Laravel", $text); // الناتج: أنا أحب Laravel
PHP
🔸 preg_split() – تقسيم نص
$data = "apple,orange,banana";
$parts = preg_split("/,/", $data);
print_r($parts);
PHP
🔸 preg_grep() – تصفية مصفوفة
$fruits = ["apple", "orange", "banana"];
$result = preg_grep("/a/", $fruits);
print_r($result); // فقط التي تحتوي على حرف a
PHP
🟦 4. تركيب التعبير النمطي (Pattern Syntax)

النمط يُكتب بين فواصل، عادةً /:

"/pattern/modifiers"
PHP

مثال:

"/php/i" // نمط يبحث عن php بأي حالة
PHP
🟦 5. الرموز الأساسية
الرمزالمعنىمثال
.أي حرف/p.p/ تطابق: “pip”, “pop”
^بداية النص/^php/ تطابق فقط إذا بدأت بـ “php”
$نهاية النص/php$/ تطابق إذا انتهى بـ “php”
[]أحد الرموز المحددة/[abc]/ تطابق a أو b أو c
``أو
()تجميع/(php)+/ تطابق كلمة php متكررة
🟦 6. Quantifiers – التكرار
الرمزالمعنىمثال
*صفر أو أكثر/a*/
+مرة أو أكثر/a+/
?صفر أو مرة/a?/
{n}n مرات/a{3}/
{n,}n أو أكثر/a{2,}/
{n,m}بين n و m/a{2,4}/
🟦 7. Character Classes
الرمزالمعنىمثال
\dرقم/\d+/ يطابق 123
\Dغير رقم/\D+/
\wحرف أو رقم أو _/\w+/
\Wغير ذلك/\W+/
\sمسافة/\s+/
\Sغير مسافة/\S+/
🟦 8. Anchors
الرمزالمعنى
^بداية السطر
$نهاية السطر
\bبداية أو نهاية كلمة
\Bليس في بداية/نهاية كلمة

مثال:

preg_match("/\bphp\b/", "I love php!") // تطابق صحيح
</code>
PHP
🟦 9. Capturing Groups – الأقواس
preg_match("/(\d+)-(\w+)/", "123-test", $matches);
print_r($matches);
/*
[0] => 123-test
[1] => 123
[2] => test
*/
PHP
🟦 10. Modifiers – التعديلات
الرمزالوظيفة
iتجاهل حالة الأحرف
mتطابق متعدد الأسطر
sالسطر الجديد . يطابقه أيضًا
uدعم UTF-8
11. التحقق من المدخلات
بريد إلكتروني:
$email = "[email protected]";
if (preg_match("/^[\w\.-]+@[\w\.-]+\.\w+$/", $email)) {
    echo "بريد صحيح";
}
PHP
رقم هاتف:
preg_match("/^01[0-2][0-9]{8}$/", "01234567890");
PHP
🟦 أولًا: Lookahead / Lookbehind
🔸 1. Positive Lookahead (?=...)

🔍 يتحقق من وجود نص معين بعد موقع معين دون تضمينه في المطابقة.

✅ مثال:

نريد كلمات تسبقها @ ولكن لا نطبع @:

$text = "@admin @user guest";
preg_match_all("/(?<=@)\w+/", $text, $matches);
print_r($matches);
/*
النتيجة:
[
  [0] => admin
  [1] => user
]
*/
PHP
🔸 2. Negative Lookahead (?!...)

❌ يتحقق أن النص التالي غير مطابق لنمط معين.

✅ مثال:

مطابقة كل الأرقام ما عدا التي تليها كلمة “USD”:

$text = "100USD 200EUR 300USD 400TRY";
preg_match_all("/\d+(?!USD)/", $text, $matches);
print_r($matches);
/*
النتيجة:
[
  [0] => 200
  [1] => 400
]
*/
PHP
🟦 ثانيًا: Lookbehind
🔸 3. Positive Lookbehind (?<=...)

🔍 يتحقق من وجود نص معين قبل الموقع الحالي.

✅ مثال:

مطابقة كل الكلمات التي تتبع الرمز @ فقط:

$text = "مرحبًا @yasin و @ali و ziad";
preg_match_all("/(?<=@)\w+/", $text, $matches);
print_r($matches);
/*
[
  [0] => yasin
  [1] => ali
]
*/
PHP
🔸 4. Negative Lookbehind (?<!...)

❌ يتحقق أن النص الذي يسبق لا يطابق نمطًا معينًا.

✅ مثال:

مطابقة أرقام ليست مسبوقة بعلامة $:

$text = "$100 200 €300";
preg_match_all("/(?<!\$)\d+/", $text, $matches);
print_r($matches);
/*
[
  [0] => 200
  [1] => 300
]
*/
PHP
🟦 ثالثًا: Named Capturing Groups
🔸 5. (?<name>...)

بدلًا من الاعتماد على الرقم [1], [2] للمجموعات، يمكنك إعطاء كل مجموعة اسمًا مفيدًا.

✅ مثال:
$text = "الاسم: Yasin, العمر: 25";
preg_match("/الاسم:\s(?<name>\w+),\sالعمر:\s(?<age>\d+)/", $text, $matches);
echo "الاسم: " . $matches['name'] . "\n"; // Yasin
echo "العمر: " . $matches['age'];        // 25
PHP

✨ مفيد جدًا عند التعامل مع JSON أو عند تحليل نصوص معقدة.

🟦 رابعًا: Backreferences (الرجوع للمجموعة السابقة)
🔸 6. \1, \2

تُستخدم لمطابقة نفس النص الذي تم التقاطه من مجموعة سابقة.

✅ مثال:

مطابقة تكرار نفس الكلمة مرتين:

$text = "hello hello world";<br>preg_match("/(\b\w+\b)\s+\1/", $text, $matches);<br>print_r($matches);<br>/*<br>[0] => hello hello<br>[1] => hello<br>*/<br>
PHP

🔄 هنا:

  • (\b\w+\b) تلتقط كلمة.
  • \1 تتأكد أن نفس الكلمة تكررت.
🟦 خامسًا: استخدام كل الميزات معًا (Advanced Example)
$text = "Product: iPhone, Price: $999";
$pattern = "/Product:\s(?<product>\w+),\sPrice:\s\$(?<price>\d+)/";
preg_match($pattern, $text, $matches);
echo "المنتج: {$matches['product']}, السعر: {$matches['price']}";
PHP
✅ خلاصة ونصائح:
الموضوعالفائدةالمحاذير
Lookahead/Lookbehindالتحقق دون التقاطقد لا تعمل في PHP القديمة
Named Groupsيسهل قراءة الكودتأكد من دعم PHP 7.3+
Backreferencesمطابقة مكررةانتبه من التكرارات الزائفة