Соответствие вложенному [quote] при использовании RegExp - PullRequest
0 голосов
/ 03 марта 2010

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

Пример:

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>

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

Ответы [ 4 ]

3 голосов
/ 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 заменяется совпадением первой группы шаблона ((/?), либо /, либо пусто).

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

2 голосов
/ 03 марта 2010

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

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

1 голос
/ 03 марта 2010

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

s/\[quote\]/\<blockquote\>/
s/\[\/quote\]/\<\/blockquote\>/
1 голос
/ 03 марта 2010

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

...