2011-02-28 73 views
1

有很多類似的問題,但我嘗試了大約15個不同的preg_match示例,但都沒有完全工作。將www或http開頭的多個文本網址轉換爲絕對鏈接

我有很多用戶提交的內容,其中大部分都有url ..有時以http://www.site.com/page的形式,有時像www.site.com,並且經常包含在括號內(www.site.com/page.html) 。

我沒有找到一種模式來解析一個字符串,並將所有這些轉換爲絕對html鏈接。想知道是否有人可以幫助我。我發現了幾個正則表達式,似乎他們會工作,但我不知道如何正確轉換爲絕對html鏈接,當有一些與http和一些沒有...

這裏有幾個表達式,我曾嘗試:

function makeLinks($text) { 
    $text = preg_replace('(((f|ht){1}tp://)[[email protected]:%_\+.~#?&//=]+)', 
     '(<a href="\\1">\\1</a>)', $text); 
    $text = preg_replace('(www\.[a-zA-Z0-9\-]\.[^ ]+)', 
     '(<a href="\\1">\\1</a>)', $text); 

     return $text; 
} 

function makeLinks($text) { 
    $text = preg_replace('~(?:www|http://)\S+~', '<a href="$0">$0</a>', $text); 

     return $text; 
} 

function makeLinks($text) { 
    $text = preg_replace('@(?<![.*">])\b(?:(?:https?|ftp|file)://|[a-z]\.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]@i', '<a href="\0" target="_blank">\0</a>', $text); 

     return $text; 
} 
+0

很抱歉,但也許有些樣品代碼將有助於解釋你正在努力達到的目標。就像你之前的代碼一樣,你說你試過了。 – burntblark 2011-02-28 07:54:06

+0

以www或http開頭的網址是絕對鏈接。我不確定你想要完成什麼。現在,沒有http://的地址可能不會被正確解釋(由古老的/破碎的瀏覽器),但無論這些都是絕對鏈接,添加「http://」的正則表達式將是微不足道的。再一次,我不明白你的問題。你能否詳細說明一下? – rockerest 2011-02-28 08:17:43

+0

或者,也許你想從你的網址中刪除域名+協議 – burntblark 2011-02-28 09:42:05

回答

2

我結束了使用此字符串,這似乎在所有必要的情況下將表現良好:

function makeLinks($text) { 
    $text = preg_replace('%(((f|ht){1}tp://)[-a-zA-^[email protected]:\%_\+.~#?&//=]+)%i', 
    '<a href="\\1">\\1</a>', $text); 
    $text = preg_replace('%([[:space:]()[{}])(www.[[email protected]:\%_\+.~#?&//=]+)%i', 
    '\\1<a href="http://\\2">\\2</a>', $text); 

     return $text; 
} 
+0

You have to add ! and , in your regex and add [s]? in the first preg for https : '$text = preg_replace('%(((f|ht){1}tp[s]?://)[-a-zA-^[email protected]:\%_\+.,!~#?&//=]+)%i','\\1',$ text); $ text = preg_replace('%([[:space:]()[{}])(www。[ - a-zA-Z0-9 @:\%_ \ +。,!〜#?&//=] +)%i','\\ 1 \\2',$ text);' 因爲有,而!在一些網址(例如metronews.fr) – zeuf 2014-05-28 11:03:15

+0

我必須添加)和(也在正則表達式中, – zeuf 2014-06-19 13:54:25

+0

我必須添加; – zeuf 2015-02-06 11:17:29

0

這是一個良好的開端:

function makeLinks($text) { 
    $text = preg_replace('~(?:www|http://)\S+~', '<a href="$0">$0</a>', $text); 
    return $text; 
} 

$ 0是全場比賽。如果您只對不帶http://www.http://www.的部分進行分組,則可以將其連接到前端。

試試這個,如果你還在尋找一個答案:

function makeLinks($text) { 
    $text = preg_replace('~(?:http://|)(?:www\.|)(\S+)~', '<a href="http://www.$1">$0</a>', $text); 
    return $text 
} 
+0

that didn't work for me... it turned every word into a hyperlink – Damon 2011-03-06 02:46:02

+1

Oh sorry try '~\b(?:http://www.|http://(?!www.)|(? RedSoxFan 2011-03-07 00:13:30

+0

I am not getting expected result. Please use the proper variables inside functional flow. ex: ($tect, $text, $test) used to indicate single variable. – Navane 2013-03-14 16:01:35