$pattern = "/\[url\=(.*)\](.*)\[\/url\]/i";
上記のパターンは bbcode を html に書き換えますが、自分のドメインからのリンクを除外したいと考えています。正規表現を変更して、すべての外部リンクでは機能するが、自分のドメインへのリンクでは機能しないようにすることはできますか?
ドメインが であると仮定するとexample.com
、このパターンは次のように機能します。
/\[url\=((?:(?!example\.com).)*)\](.*)\[\/url\]/i
そのようなことをしたいときはいつでも、通常は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);