PHP/regex: فشلت إعادة عمل بسيطة لـ BBCode [S] أو [Strike
سؤال
للحصول على محلل بي بيكود سخيف ، أردت إضافة تعريفين إلى واحد ، كان تعريفي الأصلي هو هذا لـ preg_replace:
'#\[s\](.*?)\[/s\]#si', '<strike>\\1</strike>'
وهذا يعمل ، تمنيت للمستخدم أن يتمكن من استخدامه أيضًا [s]
أو [strike]
لبدء نص في هذا التنسيق ، لذلك أضفت بشكل طبيعي شيئًا كهذاً يعتقد أنه سيعمل:
'#\[(s|strike)\](.*?)\[/(s|strike)\]#si', '<strike>\\1</strike>'
لسوء الحظ ، فشل ذلك ، بدلاً من ما تتوقعه ، كلاهما [s]
و [strike]
(يستخدم بشكل صحيح) اجعل: و s
(إن تخفيضي الصحيح لإظهار نتائجه الحقيقية ، فإنه يظهر S أو الإضراب بغض النظر عن ما بداخله)strike
لماذا يحل محل النص الداخلي باسم العلامة بدلاً من ذلك؟ هل مضيفتي أقواس حول S | ضرب المشكلة؟ ربما أفعل كل هذا خطأ ..
المحلول
المشكلة هي أنك أضفت مجموعتين جديدتين من Regex ، (s|strike)
في العلامة الافتتاحية و (s|strike)
في علامة الإغلاق. لذا داخل الرمز الناتج ، ستحصل s
أو strike
. يمكنك إصلاح ذلك بمجرد استخدام رقم المجموعة الصحيح ، 2
.
هناك طريقة أخرى تتمثل في جعل هذه المجموعات الجديدة غير مرجعية ، بإضافة أ ?:
إلى البداية ، لكنني أعتقد أن الحل الأول أسهل في فهمه:
#\[(?:s|strike)\](.*?)\[/(?:s|strike)\]#si