我正在尝试从我的公告板中删除嵌套引用,但是我遇到了一些问题。
示例输入:
[quote author=personX link=topic=12.msg1910#msg1910 date=1282745641]
[quote author=PersonY link=topic=12.msg1795#msg1795 date=1282727068] The message in the original quote [/quote]
A second message quoting the first one
[/quote]
[quote author=PersonZ link=topic=1.msg1#msg1 date=1282533805]
A random third quote
[/quote]
示例输出
[quote author=personX link=topic=12.msg1910#msg1910 date=1282745641]
第二个引用中的消息
[/quote]
[quote author=PersonZ link=topic=1.msg1#msg1 date=1282533805]
一个随机的第三方报价
[/quote]
如您所见,嵌套的引用(原始消息)已被删除,以及引用标记。
我似乎无法弄清楚。
当我尝试时
$toRemove = '(\\[)(quote)(.*?)(\\])';
$string = $txt;
$found = 0; echo preg_replace("/($toRemove)/e", '$found++ ? \'\' : \'$1\'', $string);
它会移除每个引用标签的所有出现,除了第一个出现的标签。
但是当我扩展代码时:
$toRemove = '(\\[)(quote)(.*?)(\\])(.*?)(\\[\\/quote\\])';
$string = $txt;
$found = 0; echo preg_replace("/($toRemove)/e", '$found++ ? \'\' : \'$1\'', $string);
它完全停止工作了。
对此有什么想法吗?
编辑:
谢谢你的帮助,Haggi。
然而我仍然遇到麻烦。
围绕着while循环的部分
while ( $input = preg_replace_callback( '~\[quoute.*?\[/quote\]~i', 'replace_callback', $input ) ) {
// replace every occurence
}
移除额外的u和引号后,页面会无限循环。当匹配被更改时,页面不会执行任何操作。
我已经确定原因是匹配问题。
更改为:
$input = preg_replace_callback( '/\[quote(.*?)/i', 'replace_callback', $input );
代码开始工作了,但是当更改为
$input = preg_replace_callback( '/\[quote(.*?)\[\/quote\]/i', 'replace_callback', $input );
它再次停止工作。
另外,undo_replace 函数存在问题,因为它从未找到存储的哈希值,仅会发出有关未找到索引的警告。我想正则表达式匹配 sha1 不正确。
现在我拥有的完整代码:
$cache = array();
$input = $txt;
function replace_callback( $matches ) {
global $cache;
$hash = sha1( $matches[0] );
$cache["hash"] = $matches[0];
return "REPLACE:$hash";
}
// replace all quotes with placeholders
$input = preg_replace_callback( '/\[quote(.*?)\[quote\]/i', 'replace_callback', $input );
function undo_replace( $matches ) {
global $cache;
return $cache[$matches[1]];
}
// restore the outer most quotes
$input = preg_replace_callback( '~REPLACE:[a-f0-9]{40}~i', 'undo_replace', $input );
// remove the references to the inner quotes
$input = preg_replace( '~REPLACE:[a-f0-9]{40}~i', '', $input );
echo $input;
再次感谢大家提供的任何想法 :)