273 votes

L'indicateur multiligne des regex en javascript ne fonctionne pas

J'ai écrit une regex pour récupérer une chaîne de caractères à partir du html, mais il semble que le drapeau multiligne ne fonctionne pas.

Ceci est mon modèle et je veux obtenir le texte dans la balise h1.

var pattern= /<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/mi
m = html.search(pattern);
return m[1];

J'ai créé une chaîne de caractères pour le tester. Lorsque la chaîne contient " \n "le résultat est toujours nul. Si je supprime tous les " \n " il m'a donné le bon résultat, que ce soit avec ou sans le drapeau /m.

Qu'est-ce qui ne va pas avec mon regex ?

620voto

molf Points 34978

Vous êtes à la recherche de la /.../s également connu sous le nom de dotall modificateur. Il force le point . pour correspondre également aux nouvelles lignes, qu'il ne fait pas par défaut.

La mauvaise nouvelle est qu'il n'existe pas en Javascript. La bonne nouvelle, c'est que vous pouvez le contourner en utilisant une classe de caractères (par ex. \s ) et sa négation ( \S ) ensemble, comme ceci :

[\s\S]

Donc, dans votre cas, la regex deviendrait :

/<div class="box-content-5">[\s\S]*<h1>([^<]+?)<\/h1>/i

21voto

Greg Points 132247

Vous voulez le s (dotall), qui apparemment n'existe pas en Javascript - vous pouvez remplacer le modificateur . avec [ \s\S ] comme suggéré par @molf. Le site m (multiligne) fait que ^ et $ correspondent à des lignes plutôt qu'à la chaîne entière.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X