مساعدة في Regex التي تخطر مساحة بيضاء الرائدة

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

  •  12-09-2019
  •  | 
  •  

سؤال

أنا تعديل وظيفة أساسية لمكتبة كوهانا، النص :: auto_p () وظيفة.

تصف الوظيفة نفسها باسم "NL2BR () على المنشطات". أساسا، يوفر <br /> فواصل سطر واحد، لكن استراحات خط مزدوج محاطة <p> العلامات.

القيد الذي وجدته معه هو أنه سوف <br />ق في <pre> جزء. سيؤدي ذلك إلى إنشاء خطوط جديدة مزدوجة، والتي ليست ما أريد. لقد قمت بتعديل لالتقاط العناصر المحددة باستخدام Regex، وخلاقي يقوم بإيقافه <br /> الذي يعمل بخير.

ومع ذلك، فإن المشكلة الرئيسية هي أن لدي عينات رمز في نصي الذي يحصل auto_p()أحتاج، وأحتاج إلى الحفاظ على المسافة البادئة (للقراءة). لسوء الحظ بالنسبة لي، فإن وظيفة الشرائط التي تقود وخلف المساحة البيضاء على الخطوط.

هنا هو Regex الذي يشرف مساحة الرائدة

$str = preg_replace('~^[ \t]+~m', '', $str);

أنا لست أفضل Guru Regex، لكنني متأكد من أن "احصل على مسافات ورائدة في علامات التبويب حيث يوجد واحد على الأقل واستبدالها بسلسلة فارغة."

لقد حاولت إزالة هذا الخط، ولكن بعد ذلك سوف تضيف <br /> حيث بالتأكيد لا أريدهم - في حالة واحدة، كنت أحصل على الإخراج مثل هذا

<ul><br />
    <li>something</li>
</ul>

كيف يمكنني تعديل هذا Regex أو التعليمات البرمجية لعدم تناول مساحة الرائدة داخل <pre> جزء؟

وظيفة المساعد الأصلية من كوهانا متاحة هنا. وبعد (انتقل إلى أسفل تقريبا).

أعلم أنني سأحصل على عدد قليل من الإجابات من نوع "استخدام محلل HTML" - وبينما قد تكون صحيحة - الرمز الحالي يستخدم ببساطة Regex، وأود أن أفضل حل أبسط (حيث لا يجب عليك تضمين مكتبة إلخ) وبعد

شكرا على وقتك.

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

المحلول

إليك كيف سأفعل ذلك:

$str = preg_replace(
    '~^[ \t]++(?=(?:[^<]++|<(?!/?+pre\b))*+(?:\z|<pre\b))~im',
    '', $str);

بعد مطابقة بعض مستويات المسافة البارزة في خط، فإن الفحص المظهر للمسح المقدمة <pre> أو </pre> العلامات. لحم Lookahead هو هذا الشيء:

(?:[^<]++|<(?!/?+pre\b))*+

يطابق صفر أو أكثر من أي شيء ليس قوسا زاوية اليسار، أو قوس الزاوية اليسرى إذا لم تكن بداية <pre> أو </pre> بطاقة شعار. هذا الجزء سوف يتوقف فقط مطابقة عندما تصادف <pre> (بدء) علامة، </pre> (النهاية) علامة، أو نهاية المدخلات. إذا كانت علامة النهاية التي توقف عنها، فأنت تعرف أنك داخل <PRE> العنصر، لذلك لا تريد أن تفعل الاستبدال.

الكميات التملية ('++', '*+', ، و '?+') ضرورية لمنع التراجع الكارثي. وبعد (لا أستطيع مساعدته: هذه العبارة دائما تجعلني أفكر في رنين سيناريو سلسلة من نصف الحياة.)

تتحمل هذه التقنية أيضا HTML بشكل جيد، أي، كل شيء <pre>...</pre> العلامات متوازنة بشكل صحيح. سوف تعزز العلامات داخل تعليقات SGML، أيضا - ما لم تكن متوازنة. يمكنك التعامل مع التعليقات أيضا، إذا كنت لا تمانع في جعل Regex مرتين أوقاتا وثلاث مرات قبيحة. :)

نصائح أخرى

تمت مناقشة مشكلتك كثيرا أعتقد - تحقق من هذا الرابط

http://us3.php.net/manual/en/function.nl2br.php#1828.

هذا واحد كذلك:

http://us3.php.net/manual/en/function.nl2br.php#39641.

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