🟦 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 | مطابقة مكررة | انتبه من التكرارات الزائفة |