2010-09-02 9 views
1

J'essaie de faire correspondre des URL avec une expression Regex testée, mais lorsque j'utilise JavaScript pour évaluer, elle renvoie false.JavaScript Expression régulière ne correspondant pas <a> Tags

Voici mon code:

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])); 
} 

Quelqu'un a une idée de ce qui se passe?

+1

Est-il (http://en.wikipedia.org/ [Earl] wiki/Hurricane_Earl_% 282010% 29)? – BalusC

Répondre

0

Il y a plusieurs problèmes.

Vous devez échapper les barres obliques inverses. Tout caractère ayant une signification particulière doit être échappé avec une barre oblique inverse dans l'expression régulière, et la barre oblique inverse elle-même doit être échappée dans la chaîne. Effectivement, \s devrait être représenté comme \\s si vous le construisez avec new Regexp("\\s").

Vous devez autoriser plus de caractères dans vos URL. Actuellement, vous n'autorisez pas les caractères /. Je voudrais proposer une classe de caractères comme [^"] pour correspondre à tout après http://. (Échapper le caractère " lorsqu'il est utilisé dans la chaîne ta rendra [^\"]

Vous n'êtes pas prendre en compte les attributs alt Vous ne correspondez title attributs, non alt attributs

Un exemple de réalisation:...

// 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])); 
} 

Les trois exemples correspondent ce regex.

2

Vous devez éviter les barres obliques inverses lors de la création d'expressions régulières avec le nouveau RegExp() puisque vous passez une chaîne et une barre oblique inverse est également un caractère d'échappement pour les chaînes.

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

Ou simplement écrire votre expression rationnelle comme littéraux.

var re = /\s/; 

De même, si vous voulez faire correspondre des URL, pourquoi prendre en compte un tag HTML complet? L'expression rationnelle suivante suffirait:

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

Je ne peux pas croire que j'ai négligé cela. Merci pour votre aide, c'était mon problème. J'ai regardé cette expression depuis trop longtemps en essayant de comprendre cela. Très appréciée! – Wade

Questions connexes