0

好的,我有一个字符串如下:

$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实际字符串(变量)上的a 应该摆脱根据变量$message不允许的所有 bbc 代码:$disallowedBBC

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

但是,由于某种原因,[hr]标签正在通过这个 preg_replace。所以,在这种情况下:

$message = '[hr]Test';

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

基本上...

如何更改它以完全删除所有 [hr] 和/或 [hr]Test[/hr]?但也需要摆脱 [url=http://someurl.com]Some Url[/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...

4

1 回答 1

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);
于 2012-08-22T03:05:41.457 回答