Menu
flag Ar iconالعربيةdown icon

الدالة preg_replace() في PHP: الاستبدال بالتعابير النمطية

تستبدل preg_replace($pattern, $replacement, $subject) كل تطابق لتعبير نمطي: تدمج preg_replace('/\s+/', ' ', $text) المسافات البيضاء. تعلّم المراجع الخلفية مثل $1، وpreg_replace_callback، وحذف المحارف غير الأبجدية الرقمية، والحدود والعدّ.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

تجد preg_replace($pattern, $replacement, $subject) كل تطابق لتعبير نمطي في نص وتستبدله. تحوّل preg_replace('/\s+/', ' ', $text) كل سلسلة من المسافات وعلامات الجدولة والأسطر الجديدة إلى مسافة واحدة.

لا يتغير النص الأصلي؛ تعيد preg_replace() نصًا جديدًا. ويحدد \b حد كلمة، ولهذا تُترك cats كما هي.

المراجع الخلفية: 1و1 و{1} و\1

في نص الاستبدال، يمثل $1 ما طابقته مجموعة الالتقاط الأولى، و$2 الثانية، و$0 التطابق كله. استخدمها لإعادة ترتيب النص المطابق.

اكتب نص الاستبدال بين علامتي تنصيص مفردتين. داخل المزدوجتين يصبح "\1" تسلسل هروب ثمانيًا (البايت 0x01) ويُقرأ "${1}" متغيرًا اسمه 1، وهو غير معرّف ويستخدم صيغة نصية مهملة منذ PHP 8.2. يعمل '\1' بين علامتي التنصيص المفردتين مثل '$1'، لكن $1 هي الكتابة الشائعة.

حذف المحارف غير الأبجدية الرقمية

تطابق فئة المحارف المنفية، [^...]، كل ما لم يُذكر. واستبدالها بـ '' يحذفه. وللنصوص بلغات أخرى، استخدم فئات Unicode \p{L} (أي حرف) و\p{N} (أي رقم) مع المعدّل u، وإلا حذفت é وü وكل محرف ياباني.

صنع رابط مختصر (slug)

تحوّل عدة أنماط متتالية عنوانًا إلى رابط مختصر. حوّل إلى أحرف صغيرة أولًا، واستبدل كل سلسلة من المحارف غير الأبجدية الرقمية بشرطة واحدة، ثم احذف الشرطات من الطرفين:

عدة أنماط وحد وعدّ

يمكن أن يكون $pattern و$replacement مصفوفتين: يُستبدل كل نمط بالبديل الذي في الفهرس نفسه، بالترتيب. ويحدد الوسيط الرابع عدد الاستبدالات لكل نمط (-1 تعني دون حد)، ويتلقى الخامس عدد الاستبدالات التي جرت.

حساب البديل بـ preg_replace_callback

عندما يعتمد البديل على التطابق، استخدم preg_replace_callback(). تستدعي دالتك مرة لكل تطابق مع مصفوفة $matches وتُدرج ما تعيده الدالة. وتُبقي الدالة السهمية دوال الاستدعاء القصيرة في سطر واحد.

تأخذ preg_replace_callback_array() مصفوفة من أزواج pattern => callback عندما يحتاج كل نمط من عدة أنماط إلى دالته الخاصة.

نص الاستبدال من متغير

لـ $ وللشرطة المائلة العكسية في نص الاستبدال معنى، لذا قد يتشوه نص استبدال قادم من مستخدم أو قاعدة بيانات. يُقرأ سعر مثل $10 مرجعًا إلى المجموعة 10، وهي غير موجودة، فيخرج فارغًا:

عندما لا يكون نص البحث ولا البديل نمطًا، تكون str_replace() الخيار الأبسط والأسرع. ولاختبار نمط قبل استبدال أي شيء، راجع preg_match().

الأسئلة الشائعة

كيف أستخدم المراجع الخلفية في preg_replace؟

أشر إلى مجموعات الالتقاط بـ $1 و$2 (أو \1) في نص الاستبدال: تعيد preg_replace('/(\d{4})-(\d{2})-(\d{2})/', '$3/$2/$1', '2026-03-14') النص "14/03/2026". اكتب نص الاستبدال بين علامتي تنصيص مفردتين، واستخدم ${1} عندما يلي المرجعَ رقمٌ.

كيف أحذف كل المحارف غير الأبجدية الرقمية في PHP؟

تُبقي preg_replace('/[^a-zA-Z0-9]/', '', $s) حروف ASCII وأرقامها فقط. وللإبقاء على حروف كل اللغات (é وü و日本語)، استخدم فئات Unicode مع المعدّل u: preg_replace('/[^\p{L}\p{N}]/u', '', $s).

ما الفرق بين preg_replace وpreg_replace_callback؟

تأخذ preg_replace() نص استبدال ثابتًا فيه عناصر نائبة $1. وتستدعي preg_replace_callback() دالة لكل تطابق وتستخدم القيمة التي تعيدها، فيمكنك حساب البديل: تحويله إلى أحرف كبيرة، أو إجراء عملية حسابية عليه، أو البحث عنه في مصفوفة.

هل أستخدم str_replace أم preg_replace؟

استخدم str_replace() عندما تستبدل نصًا ثابتًا: فهي أسرع ولا تحتاج إلى تهريب. واستخدم preg_replace() عندما يتبع النص المراد استبداله نمطًا، مثل أي سلسلة من المسافات، أو أي رقم، أو حد كلمة.

كيف أستبدل أول تطابق فقط بـ preg_replace؟

مرّر حدًا وسيطًا رابعًا: تعيد preg_replace('/\d+/', '#', 'a1 b2 c3', 1) النص "a# b2 c3". ويتلقى الوسيط الخامس، الممرر بالمرجع، عدد الاستبدالات التي جرت.

رسم توضيحي للغات البرمجة في Coddy

تعلّم البرمجة مع Coddy

ابدأ الآن