Php 使用嵌套模式的REGEX辅助?

Php 使用嵌套模式的REGEX辅助?,php,javascript,regex,preg-replace,Php,Javascript,Regex,Preg Replace,我需要解析以下字符串: [QUOTE=Mark] [QUOTE=Jack] How are you doing Mark? [/QUOTE] Good to hear from you Jack, Im doing fine! [/QUOTE] 我基本上是通过使用以下正则表达式将[quote]区域转换为样式化的div来将这组BBCode转换为HTML text = text.replace(/\[QUOTE=(.*?)]([\s\S]*?)\[\/QUOTE\]/gi, '&

我需要解析以下字符串:

[QUOTE=Mark]
  [QUOTE=Jack]
    How are you doing Mark?
  [/QUOTE]
 Good to hear from you Jack, Im doing fine!
[/QUOTE]
我基本上是通过使用以下正则表达式将[quote]区域转换为样式化的div来将这组BBCode转换为HTML

text = text.replace(/\[QUOTE=(.*?)]([\s\S]*?)\[\/QUOTE\]/gi, '<div class="quotes"><i>Quote by $1</i><br />$2</div>');
text=text.replace(/\[QUOTE=(.*?)([\s\s]*?)\[\/QUOTE\]/gi,'QUOTE by$1
$2');

这段代码将正确地解析出第一组引号,而不是嵌套的级别引号。有什么方法可以改进表达式吗?

当你进入嵌套级别时,你就失去了输入的“常规”性质。它变得更“像”


我建议您对字符串进行标记,并使用类似于a的方法对其进行解析。

如果这就是您所要做的,那么解决方案会简单得多:

text = text.replace(/\[QUOTE=(.*?)\]/gi,
                    '<div class="quotes"><i>Quote by $1</i><br />');
text = text.replace(/\[\/QUOTE\]/gi, '</div>');
text=text.replace(/\[QUOTE=(.*?)\]/gi,
“报价1美元
”); text=text.replace(/\[\/QUOTE\]/gi,”);

您的代码也可以工作,但您必须多次应用它——在本例中是两次,但如果有三重嵌套引号,则必须进行三次传递,以此类推。

我可以问一下为什么要使用javascript吗?您可能需要一种递归方法来实现这一点。将您的引号作为对象加载(Quote$AUTHER$text$subquotes…)怎么样?然后你可以输出任何你想要的格式。
PCRE-PHP中的
Atomic Grouping
不也能解决这个问题吗?只是好奇:)@yoda:不是原子分组,但使用正则表达式解析PHP中的嵌套BB很简单。问题是,他使用的是JS(据我记忆所及,它的正则表达式功能要弱得多)。