Сопоставление вложенных [quote] при использовании RegExp

Я пытаюсь заставить регулярное выражение соответствовать некоторым вложенным тегам. (Да, я знаю, что должен использовать парсер, но мой ввод будет правильным).

Пример:

Text.
More text.
[quote]
First quote
[quote]
Nested second quote.
[/quote]
[/quote]

Допустим, я хочу, чтобы регулярное выражение просто изменило теги на <blockquote>:

Text.
More text.
<blockquote>
First quote
<blockquote>
Nested second quote.
</blockquote>
</blockquote>

Как мне это сделать, одновременно сопоставляя открывающий и закрывающий теги?


person soupagain    schedule 03.03.2010    source источник


Ответы (4)


Вы не можете сопоставлять (произвольно) вложенные вещи с регулярными выражениями.

Но вы можете заменить каждый экземпляр [quote] на <blockquote> и [/quote] на </blockquote>.

person kennytm    schedule 03.03.2010
comment
Предостережение: вы можете сопоставлять вложенные элементы с заданной глубиной: blog.stevenlevithan.com/archives/regex- рекурсия - person ghoppe; 03.03.2010
comment
Вы не можете сопоставлять (произвольно) вложенные вещи с регулярными выражениями. Это ответ, который я искал :) Поэтому я использовал парсер BBCode: nbbc.sourceforge.net - person soupagain; 10.03.2010

Если вас не смущает корректность, вы можете использовать простую замену строки и заменить каждый тег отдельно. Вот пример использования PHP str_replace для замены открывающего и закрывающего тегов:

$str = str_replace('[quote]', '<blockquote>', $str);
$str = str_replace('[/quote]', '</blockquote>', $str);

Или с помощью регулярного выражения (снова PHP):

$str = preg_replace('~\[(/?)quote]~', '<$1blockquote>', $str);

Здесь совпадения \[(/?)quote] заменяются на <$1blockquote>, где $1 заменяется на совпадение первой группы шаблона ((/?), либо /, либо пусто).

Но вам действительно следует использовать синтаксический анализатор, который отслеживает открывающие и закрывающие теги. В противном случае у вас может быть открывающий или закрывающий тег, у которого нет аналога или (если вы используете дополнительные теги) который не вложен должным образом.

person Gumbo    schedule 03.03.2010
comment
@KennyTM: А, спасибо за замечание. Не знаю, как я предположил, что он хочет использовать PHP. - person Gumbo; 03.03.2010

Это паршивая идея, но вы, очевидно, пытаетесь сопоставить что-то вроде: \[\(/?\)quote\] и заменить его на: <\1blockquote>

person Jerry Coffin    schedule 03.03.2010

Вы можете использовать 2 выражения.

s/\[quote\]/\<blockquote\>/
s/\[\/quote\]/\<\/blockquote\>/
person Micah    schedule 03.03.2010