Regex & BBCode - совершенствующая вложенная цитата - PullRequest
3 голосов
/ 26 мая 2010

Я работаю над 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] из вложенной цитаты закрывает блок цитаты.

Я использую регулярное выражение:

"[quote=(.*?)\](.*?)\[/quote\]'is"

Как сделать так, чтобы вложенные цитаты отображались правильно?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 26 мая 2010

Вы можете создать рекурсивное регулярное выражение (доступно с 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), что означает «заменить N-й группой захвата», «заменить N-й следующей группой захвата», «заменить N «предыдущая группа захвата» и «заменить группу захвата с именем« a »».

0 голосов
/ 26 мая 2010

Это не та задача, для которой подходят регулярные выражения. Это почти похоже на попытку анализа HTML с помощью регулярных выражений , и мы знаем, что произойдет, когда вы сделаете это ...

То, что вы могли бы сделать, и даже тогда я не думаю, что это отличная идея, это использовать preg_split , чтобы разбить ваш входной текст на теги и нон -tags. Таким образом, вы получите такой список:

  • [QUOTE = 1]
  • (пустой)
  • [QUOTE = 1]
  • Это цитата кого-то другого
  • [/ QUOTE] * * 1 022
  • Это кто-то еще цитирует кого-то еще
  • [/ QUOTE]

Затем вы пробегаете список, конвертируя теги в HTML и выводя обычный текст без изменений. Вы даже можете получить причудливые значения и сохранить «вложенность», так что если вы встретите «[/ quote]», когда вы этого не ожидаете, вы можете справиться с ситуацией немного лучше, чем просто выводить недопустимый HTML. Кроме того, вы просто выводите вещи по мере их нахождения и позволяете HTMLPurify или что-то очистить позже.

...