需要帮助重写PHP函数

时间:2010-12-13 20:25:02

标签: php regex

我有一个解析文本表单帖子的函数,如果帖子中有链接,它会将链接重定向到一个页面,在用户点击它之前警告用户有关外部链接。

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

但如果它是指向外部域的链接 - 请将链接指向警告页面(顶部示例)。

我有点卡在这里,因为我不知道如何添加这个检查。帖子中可能有多个链接,一些可能有本地链接,一些外部链接和一些混合链接。

2 个答案:

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