Я работаю над некоторым BBcode для своего сайта.
Мне удалось заставить большинство кодов работать отлично, однако тег [QUOTE] дает мне некоторое горе.
Когда я получу что-то вроде этого:
[QUOTE=1] [QUOTE=2] This is a quote from someone else [/QUOTE] This is someone else quoting someone else [/QUOTE]
Он вернется:
> 1 said: [QUOTE=2]This is a quote from > someone else This is someone else quoting someone else[/QUOTE]
Итак, что происходит, [/ quote] из вложенной цитаты закрывает блок цитат.
Я использую Regex:
"[quote=(.*?)\](.*?)\[/quote\]'is"
Как я могу сделать это вложенным? Цитаты будут отображаться правильно?
Спасибо.
Вы можете построить рекурсивное регулярное выражение (доступно с libpcre-3.0 в соответствии с их изменением):
\[quote=(.*?)\](((?R)|.)*?)\[\/quote\]
Но было бы лучше, если вы будете следовать советам @codeka.
Обновление: (?R)
здесь означает «вставить все регулярное выражение в место, где (?R)
». Таким образом, a(?R)?b
эквивалентно (если вы забыли о захвате групп) в a(a(?-1)?b)?b
что эквивалентно a(a(a(?-1)?b)?b)?b
и т. д. Вместо (?R)
вы можете использовать (?N)
, (?+N)
, (?-N)
и (?&a)
A (?&a)
что означает «заменить N-й группой захвата», «заменить на N-й следующий захват группа »,« замените N'th предыдущую группу захвата »и« замените группу захвата «a» ».
На самом деле это не задача, для которой нужны регулярные выражения. Это похоже на попытку разбора HTML с регулярными выражениями, и мы знаем, что происходит, когда вы это делаете …
Что вы могли бы сделать, и даже тогда я не думаю, что это отличная идея, это использовать preg_split, чтобы разбить ваш входной текст на теги и не теги. Итак, вы получите список, подобный этому:
Затем вы просматриваете список, преобразующий теги в HTML и выводящий текст без изменений. Вы даже можете получить фантазию и подсчитать «вложенность», чтобы, если вы столкнулись с «[/ quote]», когда вы этого не ожидаете, вы можете справиться с ситуацией немного лучше, чем просто выводить неверный HTML. Кроме того, вы просто выводите все, когда находите их, и позволяете HTMLPurify или что-то позже его очищать.