2010-12-13 131 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