2010-11-22 1 views
2

Для глупого BBcode парсер Я хотел бы добавить два определения в одно, мое первоначальное определение было это для preg_replace:PHP/Regex: просто регулярное выражение для BBcode [с] или [удар] не работает

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

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

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

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

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

+2

BBcode не является регулярным. Используйте парсер [BBCode parser] (http://de3.php.net/manual/en/book.bbcode.php) – Gordon

+0

@ Gordon, по многим причинам я хочу использовать регулярные выражения для этого проекта. Я объединяю его со многими фильтрами/etc. – John

+0

@John Regex aint no [Золотой молот] (http://sourcemaking.com/antipatterns/golden-hammer). – Gordon

ответ

3

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

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

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

А, спасибо, это помогает мне понять. Я думал, что только '(. *?)' Будет захватить группу, я полностью забыл '(что-нибудь)' тоже. __EDIT__: но делает ли первый '(s | strike)' тоже группу? почему только второй? является первым: \ 0? Меня смущает, но я могу получить его после сна: P – John

+0

Все '(..)' группы захвата (если только он не начинается с '?:'). Но группы нумеруются, начиная с '1', потому что« группа »' 0' обычно представляет всю строку с согласованием (в данном случае '[s] некоторый текст [/ s]'). – poke

+0

Oh !! .. Теперь это имеет для меня полный смысл. Спасибо :) – John