2013-02-21 58 views
3

我有一種情況,其中包含URL鏈接的文本。的鏈接是在2種形式如何在javascript中替換不在href標記中的URL

  1. www.stackoverflow.com
  2. < A HREF = 「http://www.stackoverflow.com」 >堆棧超過流< /一個>

我我試圖創建一個簡單的函數,它使用正則表達式,它將包含帶有HREF標記的所有類型爲的鏈接,但其他鏈接已包裝爲單獨。

我有這樣的事情,但不成功。

function replaceURLWithHTMLLinks(text) { 
    var exp = /(<(\s*)a(\s)*href.*>.*<\/(\s)*a(\s*)>)/ig; 
    var matches = exp.exec(text); 
    for(var i=0; i < matches.length; i++) { 
     var line = matches[i]; 
     if(!exp.test(line)) { 
      var exp2 = /(\b(?:(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[-A-Z0-9+&@#\/%=~_|$])|」(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[^"\r\n]+」?|’(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[^'\r\n]+’?)/ig; 
      text = text.replace("http://",""); 
       text = text.replace(exp2, "<a href=http://$1>$1</a>"); 
     } 
    } 

    return text; 
} 

它不工作,但希望有人能解決這個問題:)

編輯

是固定它的解決方案,具有@MikeM答案

function replaceLinksSO(text) { 
    rex = /(<a href=")?(?:https?:\/\/)?(?:(?:www)[-A-Za-z0-9+&@#\/%?=~_|$!:,.;]+\.)+[-A-Za-z0-9+&@#\/%?=~_|$!:,.;]+/ig; 
    return text.replace(rex, function ($0, $1) { 
     if(/^https?:\/\/.+/i.test($0)) { 
      return $1 ? $0: '<a href="'+$0+'">'+$0+'</a>'; 
     } 
     else { 
      return $1 ? $0: '<a href="http://'+$0+'">'+$0+'</a>'; 
     } 
    }); 
} 
+0

可能重複的[如何用鏈接替換普通URL?](http://stackoverflow.com/questions/37684/how-to-replace-plain-urls-with-links) – Dve 2013-02-21 09:52:17

+0

@Dve不是真的重複。我試圖用鏈接替換普通的URL,只是在普通的URL沒有用href標籤包裝的情況下。因爲我在HTML文檔上這樣做。另一個正則表達式實際上完全失敗了我的測試用例。 – 2013-02-22 10:08:31

回答

3

沒有試圖分析複雜的正則表達式與上述功能,在這裏是使用玩具URL匹配模式來說明製造這種替換

的方法的示例性實現
var str = ' www.stackoverflow.com <a href="http://www.somesite.com">somesite</a> www.othersite.org ' 
    rex = /(<a href=")?(?:https?:\/\/)?(?:\w+\.)+\w+/g;  

str = str.replace(rex, function ($0, $1) { 
    return $1 ? $0 : '<a href="' + $0 + '">' + $0 + '</a>'; 
}); 

你可以改變url匹配模式並插入eg根據需要使用\s*

+0

很好的解決方案,這工作並替換了我的所有鏈接(並忽略了已經鏈接的鏈接)。我不得不使它預先掛鉤http://到url,否則鏈接將被破壞。 – 2013-02-21 13:30:05

1

的幫助下更換匹配/(https?:\/\/)?((?:www|ftp)\.[-A-Za-z0-9+&@#\/%?=~_|$!:,.;]+?)[\r\n\s]+/<a href="$1$2">$1</a>的模式將符合您的要求。

更好的正則表達式來匹配將^(?!href="[^"\n\r\s]+?").*?(https?:\/\/)?((?:www|ftp)\.[-A-Za-z0-9+&@#\/%?=~_|$!:,.;]+)$

+0

中心要求是避免匹配那些已經*鏈接的url。我在這裏沒有看到這個問題。 – 2013-02-21 10:31:30

+0

正則表達式要求輸入以空格或換行符結尾。 – 2013-02-21 10:35:15

+0

我沒有注意到。但是,它似乎不是一個處理它的非常穩健的方式。關於標點符號,關閉括號等的網址又如何呢?更好地使用負面後視,以確保它不是一個鏈接(或更好的是,與正則表達式一起使用HTML解析器)。 – 2013-02-21 10:42:38