0
$pattern = "/\[url\=(.*)\](.*)\[\/url\]/i";

我上面的模式将 bbcode 重写为 html,但我想从我自己的域中排除链接。是否可以修改正则表达式,使其适用于所有外部链接,但不适用于我自己域的链接?

4

2 回答 2

0

假设您的域是example.com,则此模式可以完成工作:

/\[url\=((?:(?!example\.com).)*)\](.*)\[\/url\]/i
于 2012-05-11T10:39:46.810 回答
0

每当您想做类似的事情时,您通常都会使用该preg_replace_callback功能。

它允许您指定一个回调函数,该函数可以在提供替换字符串之前检查进一步的条件,该替换字符串允许用相同的“替换”,因此不进行替换。

$pattern = "/\[url\=(.*)\](.*)\[\/url\]/i";
$callback = function($matches)
{
    $url = $matches[1];
    if (is_own_domain_url($url)) {
        return $matches[0]; # no changes
    } else {
        $title = $matches[2];
        return sprintf('<a href="%s">%s</a>'
                , htmlspecialchars($url)
                , htmlspecialchars($title)
        );
    }
}

$html = preg_replace_callback($pattern $callback, $bbcode);
于 2012-05-11T10:45:07.977 回答