حاجة مزيد من الانزلاق الخلفي في نمط php regexp

StackOverflow https://stackoverflow.com/questions/2145804

  •  23-09-2019
  •  | 
  •  

سؤال

عند اختبار إجابة سؤال مستخدم آخر لقد وجدت شيئًا لا أفهمه. كانت المشكلة هي استبدال كل الحرفي \t \n \r الأحرف من سلسلة مع مساحة واحدة.

الآن ، كان النمط الأول الذي جربته هو:

/(?:\\[trn])+/

وهو ما لم ينجح بشكل مدهش. جربت نفس النمط في بيرل وعملت بشكل جيد. بعد بعض التجربة والخطأ ، وجدت أن PHP يريد 3 أو 4 لاعبين خلفيين لتطابق هذا النمط ، كما في:

/(?:\\\\[trn])+/

أو

/(?:\\\[trn])+/

هذه الأنماط - لدهشتي - كلا العمل. لماذا هذه الضمادات الإضافية الضرورية؟

هل كانت مفيدة؟

المحلول

أنت بحاجة إلى 4 عرقات خلفية لتمثيل 1 في Regex لأن:

  • يتم استخدام 2 backslashes لتوحيد الخيط في سلسلة ("\\\\" -> \\)
  • 1 يتم استخدام الانزلاق الخلفي لتوحيد التكييف في محرك Regex (\\ -> \)

من DOC PHP ،

الهروب من أي حرف آخر سيؤدي إلى طباعة الانزلاق الخلفي أيضًا1

وبالتالي \\\[,

  • 1 يتم استخدام الانزلاق الخلفي لتوحيد \, ، تبقى واحدة بسبب \[ غير صالح ("\\\[" -> \\[)
  • 1 يتم استخدام الانزلاق الخلفي لتوحيد التكييف في محرك Regex (\\[ -> \[)

نعم إنه يعمل ، ولكن ليس ممارسة جيدة.

نصائح أخرى

تعمل في بيرل لأنك تمرر ذلك مباشرة كنمط regex /(?:\\[trn])+/

ولكن في PHP ، تحتاج إلى تمرير كسلسلة ، لذلك تحتاج إلى هروب إضافي للاشتعال نفسه.

"/(?:\\\\[trn])+/"

سيصبح regex لتتناسب مع خلفي واحد '//' كـ سلسلة php preg

التعبير العادي هو مجرد /(?:\\[trn])+/. ولكن نظرًا لأنك تحتاج إلى الهروب من الإضافات في تصريحات السلسلة أيضًا ، يجب التعبير عن كل ضربة خلفية \\:

"/(?:\\\\[trn])+/"
'/(?:\\\\[trn])+/'

فقط ثلاثة مساحات خلفية تعمل أيضًا لأن PHP لا يعرف تسلسل الهروب \[ ويتجاهلها. لذا \\ سيصبح \ لكن \[ سيبقى \[.

استخدم str_replace!

$code = str_replace(array("\t","\n","\r"),'',$code);

يجب أن تفعل الخدعة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top