删除“quote”标签之间的所有内容([quote])

问题描述:

我在私人消息系统中启用了嵌套引号,但是现在我想在用户悬停邮件标题时向用户显示部分消息。删除“quote”标签之间的所有内容([quote])

要从消息中获取相关文本,我想删除报价部分。

的报价结构如下:

[quote] 
    [quote] 
    dasdasa adsadsa ds a 
    [/quote] 

    ddasd asd ads adsasd 
[/quote] 

如何删除德报价标签之间的一切吗?

我已经用下面的代码试过,但嵌套报价的最后部分将不删除:

while(preg_match('#\[quote=(.*?)\](.*?)\[\/quote\]#si', $message)) { 
    $message = preg_replace('#\[quote=(.*?)\](.*?)\[\/quote\]#si', '', $message, 1); 
} 

while(preg_match('#\[quote\](.*?)\[\/quote\]#si', $message)) { 
    $message = preg_replace('#\[quote\](.*?)\[\/quote\]#si', '', $message, 1); 
} 

任何建议如何删除这些引号出消息的?谢谢!

+2

恭喜你,你已经经历了正则表达式不能被用来形容像非正规语言的*报价*语言。 – Gumbo 2010-08-07 11:28:59

+0

但是,由于PHP使用PCRE,而不是正则表达式,它仍然是可能的。 – NikiC 2010-08-07 11:31:54

一)最好不要使用正则表达式...

B)使用recursion

#\[quote](?:(?>[^[])|\[(?!/?quote])|(?R))*\[/quote]# 

我没有测试pcre,但它应该这样做。

+0

啊,我忘了PCRE可以做递归匹配。 – Gumbo 2010-08-07 11:32:20

+0

您能否给我一个递归代码的简短例子?因为我认为这不是我在几天内学到的东西,不是吗? – Arjen 2010-08-07 11:39:43

无需拨打preg_match(),然后拨打preg_replace(),此时preg_replace()可以用一次调用替换与正则表达式匹配的所有字符串。

与正在使用正则表达式的问题是,您所报告的代码会产生以下输出:

ddasd asd ads adsasd 
[/quote] 
+0

完全正确。 – Arjen 2010-08-07 11:37:49