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

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

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

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

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

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

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

1 Ответ

3 голосов
/ 22 ноября 2010

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

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

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