【发布时间】:2011-02-24 16:01:12
【问题描述】:
我想编写一个简单的(由一个 preg_replace 调用组成)论坛解析器,但遇到了嵌套标签的问题。
例如如果有人在引用某人引用某人的话,我就无法实现正确的行为。
当有:
[quote=Tom]
[quote=Jerry]
Lorem
[/quote]
Ipsum
[/quote]
Dolor.
我想要这样的东西:
<blockquote>
<p><strong>Tom wrote</strong></p>
<blockquote>
<p><strong>Jerry wrote:</strong></p>
<p>Lorem</p>
</blockquote>
Ipsum
</blockquote>
Dolor.
我有这个代码:
preg_replace('~\[quote (.+)\](.+)\[/quote\]~is', '<blockquote><p><strong>$1</strong> wrote:</p><p>$2</p></blockquote>', $value);
这个版本很贪心。如果我有两个单独的 [quote] 块,则正则表达式会包装第一个 [quote] 和第二个 [/quote] 之间的所有文本。
如果我添加 U 修饰符,它就太不贪心了 - 第一个 [quote] 标记与第一个(嵌套且不相关的)[/quote] 标记配对。
感谢您的帮助!
【问题讨论】:
-
您要么需要查看递归正则表达式,它可以处理这个问题,要么实际使用/创建解析器,而不是单独依赖正则表达式。