2011-09-26 66 views

回答

1

我會做這樣的事情:

String.prototype.linkify = function() { 
    return this.replace(/((?:ht|f)tp:\/\/)?([^:\/\s]+\w+\.(?:com|net|org))/gi, function (_, protocol, rest) { 
    var url = (protocol || "http://") + rest 
    return '<a href="' + url + '">' + url + '</a>' 
    }) 
} 

(我固定的一對夫婦的其他問題與您的代碼:你缺少一個return和你匹配使用.域名時期,而不是\.

我想我不需要指出,由於您的模式存在許多問題,因此這將與一般的URL匹配程度有多差。

+0

:你的正則表達式會怎樣?另外,你能解釋一下匿名函數中的參數替換嗎? –

+1

參數僅爲$&,$ 1,$ 2。我一般認爲匹配URL的好方法不在這個問題的範圍內,因爲它實際上是一個相當困難的問題。簡而言之,我將首先列出所有頂級域名(TLD)的完整列表,然後匹配以TLD結尾的內容,並在各方都有各種絨毛(一旦您意識到必須從頂級域名(TLD)開始就更容易了)。 –

1

如果您實際上並不需要匹配FTP URL,則可以假設鏈接的「http://」部分。這個正則表達式可以做到這一點,同時允許你也使用https。

this.replace(/(http(s)?:\/\/)?(([^:\/\s]+)\.(com|net|org))/gi, 
         '<a href="http$2://$3">http$2://$3</a>') 

我不知道你的使用情況是什麼,但我想指出這個表達式將會失敗以下網址:

這是因爲你使用了幾個硬編碼的tlds(com,net,org),並且不匹配該域之後的任何字符。

+0

聰明的解決方案,確保在適當的時候抓取https。 – Asmor