2010-08-10 72 views
1

我正在使用這個正則表達式(((ht|f)tp(s?))\://)?(www.|[a-zA-Z].)[a-zA-Z0-9\-\.]+\.(com|edu|gov|mil|net|org|biz|info|name|museum|us|ca|uk)(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\;\?\'\\\+&%\$#\=~_\-]+))*來搜索網址,唯一的問題是,它發現「你可以」是一個網址,我該如何改變它,因此那裏有一段時間才結束(在這種情況下'ca')所以'你ca'將不再工作,但'you.ca'將url正則表達式問題

+0

我可以看到你已經轉義。在你的正則表達式中,嘗試逃避它們並檢查它是否有效。 – 2010-08-10 23:02:05

+0

如果您告訴我們您的目標語言,可能有一個我們可以向您建議的庫,而不是試圖在正則表達式中編寫複雜的解析器 – 2010-08-10 23:18:56

+1

我們能否**請停止嘗試通過檢查其TLD來「驗證」URL已知值?每當ICANN批准新的TLD時,您是否真的需要更新您的表述?你真的認爲這就是目前存在的所有頂級域名? (提示:沒有) – bobince 2010-08-10 23:30:37

回答

1

你忘了逃避(www。| [a-zA-Z]。)塊中的句點。

+0

這與''.''塊之前有什麼關係?(com | edu ...'block? – 2010-08-10 23:08:40

+0

我對正則表達式不太瞭解,我怎麼會逃避它們? – 2010-08-10 23:20:26

+0

在 – zigdon 2010-08-13 00:04:35

3

用正則表達式解析uris是個難題。

要麼使用類似Regexp::Common::URI的庫,要麼準備花費大量時間來研究一堆RFC。解析URIs完全不是微不足道的,並且存在很多細微的錯誤。

0

您可以對句點字符使用量詞,因此'\。{1}'在接下來的任何操作之前都需要一個句點。

這不是調試這個問題的必要部分,但它可能有助於瞭解它。它更加明確,'{1}'比點更大,所以它也可以用作長而醜的正則表達式的分隔符,在調試過程中,您可能會不小心在點的旁邊拋出「+」或「*」 。

+0

與'\。'有什麼不同? – zigdon 2010-08-13 00:03:53

+0

+1是爲了發現不是一個,而是兩個用於'{1}'。:儘管如此,DI依然看不到我自己的使用;它增加了混亂在我看來,正則表達式會消除它帶來的任何好處。 – 2010-08-16 13:08:33