2010-12-13 122 views
1

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

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

请说明 - 此文本是从一个内嵌文本(如textarea)的大块可能会遇到多个URL?或者是有专门的网址表单字段,也许逗号分隔或等? – DeaconDesperado 2010-12-13 20:29:46

+0

它来自db。 – santa 2010-12-13 20:49:07

回答

2

试用preg_replace_callback,然后您可以处理匹配以决定它是您自己的域还是其他。

+0

有人提到它,但我不知道如何应用此解决方案... – santa 2010-12-13 20:48:39

+0

您是否阅读过文档? – metrobalderas 2010-12-13 21:02:05

+0

是的,我只是做了一遍,但我想这个概念太不同了,我无法理解它。我知道它并不像preg_replace那样取代,但我仍然不清楚如何处理它。 – santa 2010-12-13 21:07:04

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; 
} 
+1

为什么说php文档很烂?它实际上是那里最好的资源之一。如果你想要的东西不好,看看Facebook的。无论如何,似乎你正在努力继续使用'$ txt',不要。匹配已经完成,在你的linkDomain函数中做一个'print_r($ matches)'并且使用它。 – metrobalderas 2010-12-14 02:22:02

+0

我一直使用php.net作为参考,但我无法掌握这个功能。我想对于没有正式接受开发者培训的人来说。是的,Facebook文档有很多漏洞。无论如何,我一定在做错事。我甚至无法通过在linkDomain($ matches)函数中使用print_r($ matches)或任何值来查看任何数组值。我认为这是破碎的,但不知道在哪里。 – santa 2010-12-14 03:14:02

+0

好的,已在上面更新。仍然有些东西不合适 - 不工作。 – santa 2010-12-14 04:28:03