Le texte anglais original provient de Smashing Magazine . Traduit par Benhuoer . Veuillez indiquer la source lors de la réimpression.
Les expressions régulières (Regular Expression, abbr. regex) sont puissantes et peuvent être utilisées pour trouver les informations requises dans une grande chaîne de caractères. Il utilise des expressions conventionnelles de structure de caractère pour fonctionner. Malheureusement, les expressions régulières simples ne sont pas assez puissantes pour certaines applications avancées. Si la structure de filtrage est plus complexe, vous devrez peut-être utiliser des expressions régulières avancées.
Cet article vous présente les techniques avancées d'expressions régulières. Nous avons sélectionné huit concepts couramment utilisés et les avons analysés avec des exemples. Chaque exemple est une manière simple d'écrire pour répondre à certaines exigences complexes. Si vous ne comprenez toujours pas les concepts de base de la régularisation, veuillez d'abord lire cet article, ce didacticiel ou l'entrée Wiki.
La syntaxe régulière ici convient à PHP et est compatible avec Perl.
1. Cupidité/Paresse
Tous les opérateurs réguliers pouvant être qualifiés plusieurs fois sont gourmands. Ils correspondent autant que possible à la chaîne cible, ce qui signifie que le résultat de la correspondance sera aussi long que possible. Malheureusement, cette approche n’est pas toujours celle que nous souhaitons. Par conséquent, nous ajoutons le qualificatif « paresseux » pour résoudre le problème. L'ajout de "?" après chaque opérateur gourmand fait que l'expression correspond uniquement à la longueur la plus courte possible. De plus, le modificateur « U » peut également lazytiser des opérateurs qui peuvent être qualifiés plusieurs fois. Comprendre la différence entre gourmand et paresseux est la base de l’utilisation d’expressions régulières avancées.
opérateur gourmand
L'opérateur * correspond à l'expression précédente zéro ou plusieurs fois. C'est un opérateur gourmand. Veuillez consulter l'exemple suivant :
preg_match( '/<h1>.*< /h1>/', '</h1><h1>Ceci est un titre.</h1>
<h1>En voici un autre. </h1>', $matches );
Le point (.) peut représenter n'importe quel caractère à l'exception des caractères de nouvelle ligne. L'expression régulière ci-dessus correspond à la balise h1 et à tout ce qu'elle contient. Il utilise des points (.) et des astérisques (*) pour faire correspondre tout ce qui se trouve dans la balise. Les résultats correspondants sont les suivants :
<h1>Ceci est un titre. </h1>
<h1>En voici un autre. </h1>
La chaîne entière est renvoyée. L'opérateur * fera correspondre tout ce qui se trouve dans une rangée - même la balise h1 fermante au milieu. Parce qu'il est gourmand, faire correspondre l'ensemble de la chaîne est conforme à son principe de maximisation des intérêts.
opérateur paresseux
Modifiez légèrement la formule ci-dessus et ajoutez un point d'interrogation (?) pour rendre l'expression paresseuse :
/<h1>.*?< /h1>/</h1>
De cette façon, vous aurez l'impression qu'il lui suffit de faire correspondre la première balise de fin h1 pour terminer la tâche.
Un autre opérateur glouton avec des propriétés similaires est {n,}. Cela signifie que le modèle de correspondance précédent est répété n fois ou plus. Si aucun point d'interrogation n'est ajouté, il recherchera autant de répétitions que possible. S'il est ajouté, il sera répété le moins possible (bien sûr, "répéter". n fois" est le minimum).
#Créer une chaîne
$str = 'hihihi oups salut';
# Utilisez l'opérateur gourmand {n,} pour la correspondance
preg_match( '/(hi){2,}/', $str, $matches ); # matches[0] sera 'hihihi'
# Utiliser l'opérateur dégradé {n,}?
preg_match( '/(hi){2,}?/', $str, $matches ); # matches[0] sera 'hihi'
Source : travail stupide