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

Для глупых парсеров 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? Я, наверное, все это делаю неправильно.

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

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

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