Les expressions régulières (RegExps) avec le drapeau global (g) sont généralement utilisées pour trouver plusieurs occurrences d'un modèle dans une chaîne. Cependant, l'utilisation de cet indicateur avec l'indicateur insensible à la casse (i) peut conduire à des résultats inattendus.
Considérez l'exemple suivant :
var query = 'Foo B'; var re = new RegExp(query, 'gi'); var result = []; result.push(re.test('Foo Bar')); result.push(re.test('Foo Bar')); // result will be [true, false]
Dans ce scénario, la méthode de test renvoie uniquement vrai dans la première itération. Pour comprendre ce comportement, nous devons considérer le fonctionnement de l'indicateur g.
Lorsqu'il est utilisé avec l'indicateur g, un objet RegExp garde la trace du dernier index où un match a eu lieu. Lors des correspondances suivantes, RegExp commencera la recherche à partir de ce dernier index au lieu de 0.
Illustre ce concept :
var query = 'Foo B'; var re = new RegExp(query, 'gi'); console.log(re.lastIndex); // Initial value is 0 console.log(re.test('Foo Bar')); // Matches at index 0 console.log(re.lastIndex); // Updated to 6 console.log(re.test('Foo Bar')); // No match, lastIndex is still 6 console.log(re.lastIndex); // Remains at 6
Dans cet exemple, même si la chaîne Foo Bar contient une autre correspondance, le deuxième appel test renvoie false car RegExp a déjà déplacé sa position de recherche au-delà de la correspondance.
Par conséquent, l'utilisation du drapeau g en conjonction avec le drapeau i peut entraîner des correspondances manquées si la chaîne de recherche contient plusieurs instances du modèle avec une casse variable. Pour éviter cela, envisagez d'utiliser le drapeau i sans le drapeau g ou d'utiliser un seul appel test avec le drapeau g pour trouver uniquement la première correspondance.
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!