PHP/regex: فشلت إعادة عمل بسيطة لـ BBCode [S] أو [Strike

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

  •  27-09-2019
  •  | 
  •  

سؤال

للحصول على محلل بي بيكود سخيف ، أردت إضافة تعريفين إلى واحد ، كان تعريفي الأصلي هو هذا لـ preg_replace:

'#\[s\](.*?)\[/s\]#si', '<strike>\\1</strike>'

وهذا يعمل ، تمنيت للمستخدم أن يتمكن من استخدامه أيضًا [s] أو [strike] لبدء نص في هذا التنسيق ، لذلك أضفت بشكل طبيعي شيئًا كهذاً يعتقد أنه سيعمل:

'#\[(s|strike)\](.*?)\[/(s|strike)\]#si', '<strike>\\1</strike>'

لسوء الحظ ، فشل ذلك ، بدلاً من ما تتوقعه ، كلاهما [s] و [strike] (يستخدم بشكل صحيح) اجعل: s و strike (إن تخفيضي الصحيح لإظهار نتائجه الحقيقية ، فإنه يظهر S أو الإضراب بغض النظر عن ما بداخله)

لماذا يحل محل النص الداخلي باسم العلامة بدلاً من ذلك؟ هل مضيفتي أقواس حول S | ضرب المشكلة؟ ربما أفعل كل هذا خطأ ..

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

المحلول

المشكلة هي أنك أضفت مجموعتين جديدتين من Regex ، (s|strike) في العلامة الافتتاحية و (s|strike) في علامة الإغلاق. لذا داخل الرمز الناتج ، ستحصل s أو strike. يمكنك إصلاح ذلك بمجرد استخدام رقم المجموعة الصحيح ، 2.

هناك طريقة أخرى تتمثل في جعل هذه المجموعات الجديدة غير مرجعية ، بإضافة أ ?: إلى البداية ، لكنني أعتقد أن الحل الأول أسهل في فهمه:

#\[(?:s|strike)\](.*?)\[/(?:s|strike)\]#si
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top