2012-09-15 68 views
0

我有以下代碼用於將文本中的http URL轉換爲錨標籤。它尋找任何以http,用空格(或輸入的開始/結束)包圍如何將由空格填充的url填入鏈接

function linkify (str) { 
    var regex = /(^|\s)(https?:\/\/\S+)($|\s)/ig; 
    return str.replace(regex,'$1<a href="$2" target="_blank">$2</a>$3') 
} 

// This works 
linkify("Go to http://www.google.com and http://yahoo.com"); 

// This doesn't, yahoo.com doesn't become a link 
linkify("Go to http://www.google.com http://yahoo.com"); 

它不工作的情況是,如果我只有兩個環節之間的一個空間。我假設這是因爲兩個鏈接之間的空間不能用於匹配兩個URL,在第一次匹配之後,URL已被使用後的空間。

要玩:http://jsfiddle.net/NgMw8/

有人可以提出這樣的正則表達式的方法嗎?我可以自己掃描字符串,尋找正則表達式的方式(或者某種方式,不需要掃描字符串我自己並自己創建一個新字符串。

+1

爲什麼你開始空白?爲什麼不讓你的正則表達式模式以http開始,並以找到的第一個空白匹配結束。然後你的第二個鏈接將被匹配,因爲它包含http直到匹配一個空格。 – Mark

+0

@Mark因爲我不想讓「youhttp://ww.google.com成爲鏈接」 –

+0

在這種情況下,您不會成爲鏈接的一部分。 http://www.google.com會和你在鏈接之前只是一個字符串。我認爲這將是找到有效鏈接的更準確的方法。 – Mark

回答

2

不捕獲最終的\s。符合最終$|\s

function linkify (str) { 
    var regex = /(^|\s)(https?:\/\/\S+)/ig; 
    return str.replace(regex,'$1<a href="$2" target="_blank">$2</a>') 
} 

http://jsfiddle.net/NgMw8/3/

+0

我不希望像XXX那樣的東西成爲一個鏈接,就像它沒有成爲這個評論中的一個 –

+0

@JuanMendes:我明白了,請檢查我的編輯。另外,爲什麼你需要'$ 3'?你可以在替換中放一個空格。 –

+0

如果我刪除最終的\,那麼類似於http://google.comXXX的內容將成爲鏈接。 $ 3只是爲了追加url後面的內容。嗯....也許不是...檢查 –

1

只需用一個積極的前瞻,就像這樣:這樣一來,第二個URL將匹配前面的\s,按要求

var regex = /(^|\s)(https?:\/\/\S+)(?=($|\s))/ig; 
+0

不錯,但正如João指出的那樣,不需要'($ | \ s) '在最後,因爲正則表達式的最後一個組件是'\ S +' –

0

是否有粘在URL任何HTML元素都將無法工作......

類似的問題,它的答案HERE

一些解決方案可以處理的URL,如「test.com/anothertest?get=letsgo 「和追加HTTP://

  • 解決方法做可以處理HTTPS和雜項TLD ...
+0

不知道你在說什麼......我的問題是關於由空格填充的URL的具體問題。您發佈的鏈接與我所問的內容無關。 –

+0

以及它處理填充的網址必須變成鏈接標記,url可以用http前綴或不用前綴,可以嵌套在HTML中,...我認爲這可以幫助... – Stphane