2010-04-07 17 views
2

je la chaîne suivante:jQuery regex sur plusieurs lignes

<img alt="over 40 world famous brandedWATCHES BRANDs to choose from 
" src="http://www.fastblings.com/images/logo.jpg"></strong></a><br> 

Je veux définir un motif regex comme <img alt="(.+?)" src="http://(.+?).(jpg|gif)">, mais comme vous pouvez voir la chaîne cible a un saut de ligne dans l'attribut alt - alors comment peut je l'incorpore? la règle devrait être comme "n'importe quoi dans l'alt-attribut, y compris les sauts de ligne".

+2

** DO PAS PARSE HTML en utilisant des expressions régulières **! http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – SLaks

+1

Ah, la balise 'question'. Au cas où nous aurions des questions qui ne sont pas des questions ... – SLaks

+0

La réponse que vous avez sélectionnée est en fait incorrecte. Vois ma réponse. – cletus

Répondre

4

Par défaut, l'opérateur générique . ne pas correspondance des caractères de saut de ligne (\n, \r). Dans d'autres langues, il existe un mode (parfois appelé mode ligne unique) pour que . corresponde à n'importe quoi. Javascript ne l'a pas pour une raison quelconque. Si vous voulez l'utilisation équivalente [\s\S], ce qui signifie tout caractère d'espace blanc ou est pas d'espace blanc si:

/<img alt="([\s\S]+?)" src="http:\/\/(.+?)\.(jpg|gif)">/ 

Voir Javascript regex multiline flag doesn’t work.

Aussi, j'ai échappé le . avant jpg|gif sinon il va correspondre à n'importe quel caractère et non le . que vous avez l'intention. Cela étant dit, l'analyse du code HTML avec des regex est une très mauvaise idée. De plus, à moins d'information pertinent manque à votre question, vous pouvez le faire facilement avec jQuery attribute selectors:

$("img[src='http://.*\.gif|jpg']").each(function() { 
    var alt = $(this).attr("alt"); 
    var src = $(this).attr("src"); 
    ... 
}); 

Ou si vous voulez qu'il y ait un attribut alt:

$("img[alt][src='http://.*\.gif|jpg']").each(function() { 
    var alt = $(this).attr("alt"); 
    var src = $(this).attr("src"); 
    ... 
}); 
+0

@Fixix: vous avez raison. J'ai mes fils croisés. Fixé maintenant – cletus

+0

J'ai supprimé mon commentaire car je pensais que cela fonctionnait néanmoins car la réponse acceptée utilise la même approche. En tout cas bon d'entendre que je n'ai pas manqué un point évident;) Btw +1 de moi. –