2010-01-08 29 views
10

我採取了Liberal URL Regex from Daring Fireball,將它與some of Alan Storm improvements合併,並破解我的方式修復一些錯誤,如支持括號內的國際化域名(IDN)字符。這就是我:幫助黑客格魯伯的自由URL正則表達式

/(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/ 

但是我遇到,我不是能夠解決的錯誤:

'www.dsd(sd)sdsd.com' // can also be the valid 'www.dsd.com/whatever(whatever)' 

以上URL被認定爲www.dsd(sd)sdsd.com'(或www.dsd.com/whatever(whatever)')而不是www.dsd(sd)sdsd.com(或www.dsd.com/whatever(whatever))。這似乎只發生時,URL有括號,因爲以下網址:

'www.sampleurl.com' 

是否正確被識別爲www.sampleurl.com

我覺得當URL有括號,我一直在嘗試了一段時間,但我似乎無法找到一個解決方案不能被執行的正則表達式的[^[:punct:]\s]|\/一部分。誰能幫我?

對於商品,我設置了一個Rubular permalink with the regex and some test data(最後一個URL失敗)。


我認爲格魯伯的正則表達式是有點倉促,比如它不匹配的URL,如:

http://en.wikipedia.org/wiki/Something_(Special)_For_You 

我更感動的看到,無論GruberAlan錯過這真的簡單的拼寫錯誤:

\([\w\d]+\) 

豈不\(\w+\)夠嗎? :S

回答

1

www.dsd(sd)sdsd.com不是一個有效的域名。

如果你有'www.dsd.com/whatever(whatever)',它會被正確識別。 (或者至少是在我的測試)

+0

也似乎沒有工作(http://www.rubular.com/regexes/12851)。 – 2010-01-08 17:11:51

+0

嗯,是的。我使用原始的Daring Fireball表達式(我自己使用)進行了測試。我不是正則表達式專家,所以在等待任何其他解決方案之前,我會刪除Alan Storm的改進(因爲我相信它們是無用的/不必要的) – 2010-01-09 04:30:52

+0

Daring Fireball表達式僅在括號內匹配0-9a-Z。 – 2010-01-10 00:53:13

1
/(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/ 
    www.     |    |   | 
          dsd   |   | 
              (sd)  | 
                 sdsd.com' 

這就是我認爲這打破了......上面(sd)開始有逃脫開括號正則表達式的位,然後盯着字符類進行匹配sd,那麼逃脫關閉paren,接下來的事情是[^\s()<>]*匹配sdsd.com'