حاجة مزيد من الانزلاق الخلفي في نمط php regexp
سؤال
عند اختبار إجابة سؤال مستخدم آخر لقد وجدت شيئًا لا أفهمه. كانت المشكلة هي استبدال كل الحرفي \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);
يجب أن تفعل الخدعة