2012-08-22 40 views
0

好吧,我有一个字符串,如下所示:PHP的preg_replace需要改进

$disallowedBBC = 'abbr|acronym|anchor|bdo|black|blue|br|color|email|flash|font|ftp|glow|green|html|hr|img|iurl|li|list|ltr|url|quote'; 

而不是实际的字符串preg_replace$message变量)应该摆脱所有的英国广播公司代码,根据不准$disallowedBBC变量:

$message = preg_replace("/\[($disallowedBBC)[^]]*](.*?)\[\/($disallowedBBC)\]/is", "$2", $message); 

但是,出于某种原因,该[hr]标签越来越过去,这的preg_replace。所以,在这种情况下:

$message = '[hr]Test'; 

它输出[hr]标签,而应该将其删除。我的正则表达式有什么问题?

基本上...

,使其完全删除所有[HR]和/或[HR]测试[/小时]如何改变呢?但也需要摆脱其中某些Url [/ url]的实例。它应该从一个字符串中删除[color=red]如下:[color=red]Testing

例如,它需要摆脱[{tag}],如果它有一个关闭标签[/{tag}],但如果没有关闭标签,它需要摆脱打开标签,反之亦然。它应该能够捕捉{}标签内,任何位于括号内为好,如:[quote author=Solomon time=7834783470]Just a quote here[/quote] Additional text here...

所以,这应该输出:Just a quote here Additional text here...

+0

[^]应该是[^ \\] – walrii

+3

你正则表达式匹配'[小时]测试[/小时]'而不是'[小时]测试' – xdazz

+0

这并没有改变任何东西,仍然没有摆脱[hr]标签。 –

回答

0

我认为你需要两个preg_replaces。一,首先摆脱对[HR] ... [/小时],然后第二摆脱任何剩余的[HR]的...

$message = preg_replace("/\[($disallowedBBC)[^\]]*](.*?)\[\/($disallowedBBC)\]/is", "$2", $message); 
$message = preg_replace("/\[($disallowedBBC)[^\]]*]/is", "", $message); 

我尝试做一个一步,那么诸如“abc [bla] blahblah [hr] gak [/ hr] def”之类的东西就会变成“abcdef”。如果你可以对blahblah部分设置限制,你也许可以做到。

你可以,当然,这些组合成一个的preg_replace调用使用数组语法(但请记住,为了事项):

$patterns = array("/\[($disallowedBBC)[^\]]*](.*?)\[\/($disallowedBBC)\]/is", 
        "/\[($disallowedBBC)[^\]]*]/is",); 
$replacements = array("$2", ""); 
$message = preg_replace($patterns, $replacements, $message); 
+0

你的例子需要:'[hr] Test'并输出'hrTest',但应该只输出:'Test' FYI:我在最后更新了我的问题。此外,感谢您的帮助到目前为止:) –

+0

我明白了为什么。我改变了第二个替换字符串(我没有想到)。 – walrii

+0

谢谢,这个作品完美!非常感谢! –