2010-09-02 53 views
1

我試圖用經過測試的正則表達式來匹配URL,但是當我使用JavaScript來評估它時,返回false。JavaScript正則表達式不匹配<a>標籤

這裏是我的代碼:

var $regex = new RegExp("<a\shref=\"(\#\d+|(https?|ftp):\/\/[-a-z0-9+&@#\/%?=~_|!:,.;\\(\\)]+)\"(\stitle=\"[^\"<>]+\")?\s?>|<\/a>"); 

var $test = new Array(); 
$test[0] = '<a href="http://www.nytimes.com/imagepages/2010/09/02/us/HURRICANE.html">'; 
$test[1] = '<a href="http://www.msnbc.msn.com/id/38877306/ns/weather/%29;">'; 
$test[2] = '<a href="http://www.msnbc.msn.com/id/38927104" title="dd" alt="dd">'; 
for(var i = 0; i < $test.length; i++) 
{ 
    console.log($test[i]); 
    console.log($regex.test($test[i])); 
} 

任何人有任何想法是怎麼回事?

+1

難道[厄爾(http://en.wikipedia.org/維基/ Hurricane_Earl_%282010%29)? – BalusC 2010-09-02 21:25:06

回答

0

有多種問題。

您需要避開反斜槓。任何具有特殊含義的字符都需要在正則表達式中使用反斜線進行轉義,並且反斜槓本身需要在字符串中轉義。實際上,如果使用new Regexp("\\s")構建\s,則應將其表示爲\\s

您需要在網址中允許更多字符。目前,您甚至不允許/個字符。我會建議像[^"]這樣的角色類來匹配http://之後的所有內容。在TA字符串中使用將使[^\"]時(轉義字符"

你不採取alt屬性考慮您只匹配title屬性,不alt屬性

工作的示例:。

// Ditch new Regex("...") in favour of /.../ because it is simpler. 
var $regex = /<a\shref="(#\d+|(https?|ftp):\/\/[^"]+)"(\stitle="[^"]+")?(\salt="[^"]+")?|<\/a>/; 

var $test = new Array(); 
$test[0] = '<a href="http://www.nytimes.com/imagepages/2010/09/02/us/HURRICANE.html">'; 
$test[1] = '<a href="http://www.msnbc.msn.com/id/38877306/ns/weather/%29;">'; 
$test[2] = '<a href="http://www.msnbc.msn.com/id/38927104" title="dd" alt="dd">'; 
for(var i = 0; i < $test.length; i++) 
{ 
    console.log($test[i]); 
    console.log($regex.test($test[i])); 
} 

所有三個例子匹配這個正則表達式。

2

由於您傳遞了一個字符串,並且反斜槓也是字符串的轉義字符,所以在創建正則表達式時需要使用新的RegExp()轉義反斜槓。

new RegExp("\s"); // becomes /s/ 
new RegExp("\\s"); // becomes /\s/ 

或者只是把你的正則表達式寫成文字。

var re = /\s/; 

另外,如果您想要匹配網址,爲什麼要考慮整個HTML標記? 下面的正則表達式就足夠了:

var urlReg = /^(?:\#\dhttp|ftp):\/\/[\w\d\.-_]*\/[^\s]*/i; 
// anything past the third/that's not a space, is valid. 
+0

我不敢相信我忽略了這一點。感謝您的幫助,那是我的問題。我一直盯着這個表達式,試圖弄清楚這一點太久了。非常感激! – Wade 2010-09-02 21:36:39