Maison > interface Web > js tutoriel > le corps du texte

Pourquoi l'indicateur multiligne de JavaScript (/m/) ne parvient-il pas à correspondre aux nouvelles lignes dans les expressions régulières ?

Mary-Kate Olsen
Libérer: 2024-11-08 08:00:02
original
839 Les gens l'ont consulté

Why Does JavaScript's Multiline Flag (/m/) Fail to Match Newlines in Regular Expressions?

Extraction de texte multiligne avec des expressions régulières en JavaScript

En HTML, il est souvent nécessaire d'extraire des informations à l'intérieur des balises. Une méthode pour y parvenir consiste à utiliser des expressions régulières. Cependant, l'indicateur multiligne de JavaScript (/m/) peut ne pas toujours fonctionner comme prévu.

Considérez l'expression régulière suivante, qui vise à extraire le texte entre les balises h1 dans une chaîne HTML :

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

Si cette expression régulière rencontre des nouvelles lignes (n) dans la chaîne, elle peut renvoyer null. La suppression des nouvelles lignes résout ce problème, suggérant que l'indicateur /m/ ne se comporte pas comme prévu.

La solution : le modificateur /s/ (Dotall)

Le L'indicateur /m/ modifie le comportement des caractères ^ et $, pas du . Le problème vient donc du . personnage. JavaScript ne fournit pas le modificateur /.../s (également connu sous le nom de modificateur dotall).

Solution de contournement

Pour atténuer ce problème, les développeurs JavaScript peuvent utiliser un caractère classe (par exemple, s) et sa négation (S) ensemble, như sau :

[\s\S]
Copier après la connexion

L'incorporation de ceci dans l'expression régulière d'origine donne ce qui suit :

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

Cette expression devrait réussir à extraire le texte souhaité à partir de la chaîne HTML, même en présence de nouvelles lignes.

Mise à jour ES2018

Depuis ES2018, JavaScript a introduit le drapeau s (dotAll), qui permet le . pour correspondre aux nouvelles lignes. Cela élimine le besoin de solutions de contournement. L'expression régulière mise à jour ressemblerait à ceci :

/<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/is
Copier après la connexion

Cette modification garantit la compatibilité avec les environnements JavaScript modernes où l'indicateur s est pris en charge.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal