PHP/Regex: простое регулярное выражение для bbcode [s] или [strike] не работает

Для глупых парсеров bbcode я хотел добавить два определения в одно, мое первоначальное определение было для preg_replace:

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

И это работает, я хотел, чтобы пользователь мог использовать либо [s], либо [strike], чтобы инициировать текст в этом формате, поэтому я, естественно, добавил что-то вроде этого, думая, что это сработает:

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

К сожалению, это не так, вместо того, что вы ожидаете, как [s], так и [strike] (используется правильно): s и strike моя уценка правильна, чтобы показать ее реальный результат, он показывает s или забастовку, независимо от того, что внутри нее).

Почему вместо этого он заменяет внутренний текст именем тега? Является ли добавление скобок вокруг проблемы s? Я, наверное, все это делаю неправильно.

Ответ 1

Проблема заключается в том, что вы добавили две новые группы регулярных выражений, (s|strike) в открывающий тег и (s|strike) в закрывающий тег. Поэтому внутри полученного кода вы получите s или strike. Вы можете исправить это, просто используя правильный номер группы, 2.

Другим способом было бы сделать, чтобы новые группы не ссылались, добавив ?: к началу, но, я думаю, первое решение легче понять:

#\[(?:s|strike)\](.*?)\[/(?:s|strike)\]#si