我对 PHP 和正则表达式一无所知,但我正在尝试为我的论坛修复一个损坏的插件。
我想替换以下内容:
<blockquote rel="blah">foo</blockquote>
和
<blockquote class="a"><div class="b">blah</div><div class="c"><p>foo</p></div></blockquote>
实际上,这部分很简单,我已经部分修复了插件来做到这一点。以下正则表达式用于调用以preg_replace_callback()
进行替换:
/(<blockquote rel="([\d\w_ ]{3,30})">)(.*)(<\/blockquote>)/u
回调代码为:
return <<<BLOCKQUOTE
<blockquote class="a"><div class="b">{$Matches[2]}</div><div class="c"><p>{$Matches[3]}</p></div></blockquote>
BLOCKQUOTE;
这适用于我上面的示例(非嵌套块引用)。但是,如果块引用是嵌套的,例如在以下示例中:
<blockquote rel="blah">foo <blockquote rel="bloop">bar ...maybe another nest...</blockquote></blockquote>
它不起作用。所以我的问题是,如何使用正则表达式/PHP 的组合替换所有嵌套的块引用?我知道在 PHP 中递归模式是可能的(?R)
;以下正则表达式将从包含它们的字符串中提取所有嵌套的块引用:
/(<blockquote rel="([\d\w_ ]{3,30})">)(.*|(?R))(<\/blockquote>)/s
但是从那里开始,我不太确定在preg_replace_callback()
回调中做什么来用上面的替换替换每个嵌套的块引用。
任何帮助,将不胜感激。