2011-07-12 45 views
1

我正在嘗試使用RegEX來匹配URL模式。我在這裏找到了答案: Check if a Javascript string is a url使用RegEX匹配URL模式,無效量詞?

其中指出我在這裏: http://forums.devshed.com/javascript-development-115/regexp-to-match-url-pattern-493764.html

這給了我下面的代碼(剪切和devshed粘貼到這裏和我的腳本):

function ValidURL(str) { 
    var pattern = new RegExp('^(https?:\/\/)?'+ // protocol 
     '((([a-z\d]([a-z\d-]*[a-z\d])*)\.)+[a-z]{2,}|'+ // domain name 
     '((\d{1,3}\.){3}\d{1,3}))'+ // OR ip (v4) address 
     '(\:\d+)?(\/[-a-z\d%_.~+]*)*'+ // port and path 
     '(\?[;&a-z\d%_.~+=-]*)?'+ // query string 
     '(\#[-a-z\d_]*)?$','i'); // fragment locater 
    if(!pattern.test(str)) { 
     alert("Please enter a valid URL."); 
     return false; 
    } else { 
     return true; 
    } 
} 

當我嘗試在Firefox 4.0中使用它時,Firebug 1.7.3在以下位置給出了無效的量詞錯誤:

 '(\#[-a-z\d_]*)?$','i'); // fragment locater 

有沒有人有什麼問題的想法?

從無效量詞的其他搜索,我相信*是一個問題,但不知道它可能是什麼。在我使用時,它給我的錯誤的函數問題的字符串是:

htp://localhost:1987/ 

添加的註釋 通過代理-J建議的修復至少去除無效量詞問題。 豎起大拇指

但是,它不喜歡的時候做正確上面的示例網址:

http://localhost:1987/ 

的問題是與端口。當我刪除端口#時,它喜歡localhost。

+1

的事情之一你需要解決的是,當你從這樣的字符串形成正則表達式時,你需要引用的東西是*不同* t韓,當你用正則表達式語法形成正則表達式。具體來說,在你的「/」字符之前你不需要「\」,但是你需要在諸如「d」或「?」之前加「*」字符。 – Pointy

+1

此外,錯誤的行號可能不是有趣的,因爲在調用「RegExp()」函數並解析表達式之前,不會檢測到實際錯誤。事實上,這個問題可能不是正則表達式的最後一部分。 – Pointy

+0

@Pointy,關於錯誤位置沒有給出正確位置的很好的一點。 –

回答

0

你需要躲避第一\在這裏:

'(\?[;&a-z\d%_.~+=-]*)?' 

成爲

'(\\?[;&a-z\d%_.~+=-]*)?' 
+0

這擺脫了無效的量詞。現在它不會接受上面的示例字符串:/ –

+0

我不確定你的正則表達式有什麼問題,但是至少正則表達式當前需要IPv4地址或域後綴(.com,.net, .us)等。還有其他問題,儘管我不能把它放在手指上。 –

+0

**正則表達式*中的所有**反斜槓引號除*之外的所有**字符需要加倍。 – Pointy

3

我用這個和它似乎已經工作得很好:

var re = /^(http[s]?:\/\/){0,1}(www\.){0,1}[a-zA-Z0-9\.\-]+\.[a-zA-Z]{2,5}[\.]{0,1}/; 
var isUrl = re.test(message); 
+0

它不適用於'http:// .. com' –