2012-06-08 33 views
0

我修改了一個正則表達式,我找到了here,這樣它就可以接受各種英國和二級頂級域名。如何修改此正則表達式以排除URL中的標點符號?

/\b((?:^https?:\/\/|^[a-z0-9.\-]+[.][a-z]{2,4})(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`[email protected]()\[\]{};:'".,<>?]))/i 

但是,你可以在我的測試數據here看到,正則表達式匹配的URL,如[email protected]https://m!crosoft.com這是無效的。

出於某種原因@符號被排除在.com之前,但是在.之後他們沒有。

感嘆號並不排除在外,因爲據我所知,在這段時間之前只允許使用字母,數字和破折號。

+0

是@標點符號嗎? – pguardiario

+0

我理解正則表達式很好,但是這個正則表達式非常糟糕;)爲什麼不使用'URI'(或'Addressable :: URI')解析URL,然後將主機分割爲「。」? 'URI.parse(str).host.split(「。」)' – d11wtq

+0

哇,呃......我不想讓我的名字變得模糊。我會分解任務。首先標記它。然後驗證序言。然後驗證域。 – starbolin

回答

2

的@由

[^\s()<>]+ 

而且匹配!標誌由

(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+ 

我不知道,但那些看起來並不像一個很好的正則表達式匹配的URL

嘗試它根據RFC 3986 絕對和相對url'sare相匹配的網址如下支持的。

設置不區分大小寫爲true

^ 
(# Scheme 
[a-z][a-z0-9+\-.]*: 
(# Authority & path 
    // 
    ([a-z0-9\-._~%!$&'()*+,;=][email protected])?    # User 
    ([a-z0-9\-._~%]+       # Named host 
    |\[[a-f0-9:.]+\]       # IPv6 host 
    |\[v[a-f0-9][a-z0-9\-._~%!$&'()*+,;=:]+\]) # IPvFuture host 
    (:[0-9]+)?         # Port 
    (/[a-z0-9\-._~%!$&'()*+,;=:@]+)*/?   # Path 
|# Path without authority 
    (/?[a-z0-9\-._~%!$&'()*+,;=:@]+(/[a-z0-9\-._~%!$&'()*+,;=:@]+)*/?)? 
) 
|# Relative URL (no scheme or authority) 
([a-z0-9\-._~%!$&'()*+,;[email protected]]+(/[a-z0-9\-._~%!$&'()*+,;=:@]+)*/? # Relative path 
|(/[a-z0-9\-._~%!$&'()*+,;=:@]+)+/?)       # Absolute path 
) 
# Query 
(\?[a-z0-9\-._~%!$&'()*+,;=:@/?]*)? 
# Fragment 
(\#[a-z0-9\-._~%!$&'()*+,;=:@/?]*)? 
$ 

更新1

此不匹配米!crosoft.com和@ pple.com這也可能是由於與Rublar成才。

enter image description here

+0

根據Rublar的說法,這仍然匹配'm!crosoft.com'和'@ pple.com'。它也匹配'hxxp:// www.g00.com.com'。 – Ash

+0

它不*匹配m!crosoft.com和@ pple.com我更新了我的答案和匹配。 – buckley

+0

正如你所說,它必須是Rublar錯誤。什麼程序出於興趣? – Ash