2011-05-18 56 views
0

我掙扎,試圖linkfiy鏈接帶或不帶 「WWW」/ 「HTTP」正則表達式Linkify:WWW,NONWWW,HTTP,nonHTTP

這是我得到:

 noProtocolUrl = /\b((?:www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»「」‘’]))/g, 
    httpOrMailtoUrl = /\b((?:[a-z][\w-]+:)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»「」‘’]))/gi, 
     linkifier = function (html) { 
      return FormatLink(html 
         .replace(noProtocolUrl, '<a href="<``>://$1" rel="nofollow external" class="external_link">$1</a>') // NOTE: we escape `"http` as `"<``>` to make sure `httpOrMailtoUrl` below doesn't find it as a false-positive 
         .replace(httpOrMailtoUrl, '<a href="$1" rel="nofollow external" class="external_link">$1</a>') 
         .replace(/"<``>/g, '"http')); // reinsert `"http` 

這是除了與http://的簡單鏈接都是通過兩次鏈接處理獲得的。

http://google.com將成爲兩個環節: HTTTP://http://google.com

關於如何解決此問題的任何想法?

謝謝!

編輯

嗯,我懂了工作以外的任何鏈接不鏈接HTTP *和** WWWbit.ly/foo

如果有人知道如何捕捉那些鏈接也是如此,不客氣。

var noProtocolUrl = /(^|["'(\s]|&lt;)(www\..+?\..+?)((?:[:?]|\.+)?(?:\s|$)|&gt;|[)"',])/g, 
httpOrMailtoUrl = /\b((?:[a-z][\w-]+:)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»「」‘’]))/gi, 
linkifier = function (html) { 
    return FormatLink(html 
       .replace(noProtocolUrl, '$1<a href="<``>://$2" rel="nofollow external" class="external_link">$2</a>$3') // NOTE: we escape `"http` as `"<``>` to make sure `httpOrMailtoUrl` below doesn't find it as a false-positive 
       .replace(httpOrMailtoUrl, '<a href="$1" rel="nofollow external" class="external_link">$1</a>') 
       .replace(/"<``>/g, '"http')); // reinsert `"http` 
    }, 
+0

查看http://stackoverflow.com/questions/247479/jquery-text-to-link-script – Nathan 2011-05-18 00:44:07

+0

彌敦道,問題是我正在使用更新的正則表達式(http://daringfireball.net/2010/ 07/improved_regex_for_matching_urls)將URL與括號等進行匹配。 – Santiago 2011-05-18 00:53:45

回答

2

使用

var noProtocolUrl = /(^|["'(\s]|&lt;)((?:[a-z0-9-]+\.)+(?:ac|ad|ae|aero|af|ag|ai|al|am|an|ao|aq|ar|arpa|as|asia|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|biz|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cat|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|com|coop|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|info|int|io|iq|ir|is|it|je|jm|jo|jobs|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mo|mobi|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|ne|net|nf|ng|ni|nl|no|np|nr|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tel|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|travel|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|xxx|ye|yt|za|zm|zw)(?:\/[a-zA-Z0-9_][^\s]*)?)((?:[:?]|\.+)?(?:\s|$)|&gt;|[)"',])/g, 

在你的代碼。

替代品的巨大列表是iana的tlds的權威列表,並用於終止url的服務器部分。這不是絕對必要的,但可能在方便任意文本鏈接時減少誤報的數量。

另一個修改是第二個引用的子表達式的補充,即...

(?:\/[a-zA-Z0-9_][^\s]*)? 

匹配一個可選的路徑和可能的查詢和片段標識符 - 實際上一切到字符串或結束第一個空格字符。

你可能想看看RFC 3986,它定義了uris的形式語法。根據本文檔中的規範構建一個正則表達式,將方案部分標記爲可選匹配應該將匹配的正則表達式轉換爲更加健壯的解決方案 - 但是,如果沒有那麼高的精度,您可能會相處得很好。

+0

嗯,這個工作很棒。非常感謝你collapsar! – Santiago 2011-05-20 03:55:58