PHP preg_replace需要改进

时间:2012-08-22 02:47:02

标签: php regex 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变量不允许的所有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...

1 个答案:

答案 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);