我有一个解析文本表单帖子的函数,如果帖子中有链接,它会将链接重定向到一个页面,在用户点击它之前警告用户有关外部链接。
function url2link($txt) {
$setUrl = preg_replace("/(http:\/\/|(www\.))(([^\s<]{4,68})[^\s<]*)/", '<a href="/link/$2$3" rel="nofollow">$2$4</a>', $txt);
return $setUrl;
}
我需要通过在链接中添加域检查来修改此功能。如果链接来自我自己的域,只需将其转换为可点击的链接,如下所示:
$setUrl = preg_replace("/(http:\/\/|(www\.))(([^\s<]{4,68})[^\s<]*)/", '<a href="http://$2$3" rel="nofollow" target="_blank">$2$4</a>', $txt);
但如果它是指向外部域的链接 - 请将链接指向警告页面(顶部示例)。
我有点卡在这里,因为我不知道如何添加这个检查。帖子中可能有多个链接,一些可能有本地链接,一些外部链接和一些混合链接。
答案 0 :(得分:2)
尝试使用preg_replace_callback
,然后您可以处理匹配项以确定它是您自己的域名还是其他域名。
答案 1 :(得分:0)
好的,因为事实证明preg_replace_callback正是我在这种情况下所需要的。 php.net文档糟透了。我发现另一篇文章说清楚它是什么以及它是如何工作的。我修改了我的功能,但它不起作用......我错过了什么?
function url2link($txt) {
$checkDomain = preg_replace_callback('/(http:\/\/|(www\.))(([^\s<]{4,68})[^\s<]*)/', 'linkDomain', $txt);
function linkDomain($matches) {
$host = parse_url($matches[0], PHP_URL_HOST);
$host = ltrim($host, 'www.');
if ($host == 'mydomain.com') {
$setUrl = preg_replace("/(http:\/\/|(www\.))(([^\s<]{4,68})[^\s<]*)/", '<a href="http://$2$3">$2$4</a>', $matches[0]);
} else {
$setUrl = preg_replace("/(http:\/\/|(www\.))(([^\s<]{4,68})[^\s<]*)/", '<a href="/link/$2$3" rel="nofollow">$2$4</a>', $matches[0]);
}
}
return $setUrl;
}