好的,我有一个字符串如下:
$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
变量不允许的所有bbc代码:
$message = preg_replace("/\[($disallowedBBC)[^]]*](.*?)\[\/($disallowedBBC)\]/is", "$2", $message);
但是,出于某种原因,[hr]
标记已超过此preg_replace。所以,在这种情况下:
$message = '[hr]Test';
它会输出[hr]
标记,但应删除它。我的正则表达式有什么问题?
基本上...
如何更改它以便完全删除所有[hr]和/或[hr] Test [/ hr]?但是还需要摆脱[url = http://someurl.com]某些网址[/ url]的情况。它应该从字符串中删除[color=red]
,如下所示:[color=red]Testing
例如,它需要摆脱[{tag}]
,如果它有一个结束标记[/{tag}]
,但如果没有结束标记,则需要删除开始标记,副反之亦然。它应该能够捕获括号内{tag}内的任何内容,例如:[quote author=Solomon time=7834783470]Just a quote here[/quote] Additional text here...
所以,这应输出:Just a quote here Additional text here...
答案 0 :(得分:0)
我认为你需要两个preg_replaces。一对一先摆脱[hr] ... [/ hr]对,然后一秒钟摆脱任何剩余的[hr] ......
$message = preg_replace("/\[($disallowedBBC)[^\]]*](.*?)\[\/($disallowedBBC)\]/is", "$2", $message);
$message = preg_replace("/\[($disallowedBBC)[^\]]*]/is", "", $message);
我试图一步完成,然后像“abc [br] 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);