⊗ppPmRgGL 229 of 447 menu

Limitation de la gourmandise dans les regex en PHP

Les expressions régulières sont par défaut gourmandes. Cela signifie qu'elles capturent le nombre maximum possible de caractères.

Analysons cela avec un exemple. Supposons que nous ayons la chaîne suivante :

<?php $str = 'aeeex zzz x kkk'; ?>

Supposons que nous voulions trouver la sous-chaîne 'aeeex' dans cette chaîne en utilisant le modèle suivant : la lettre 'a', suivie de n'importe quel caractère un ou plusieurs fois, suivie de la lettre 'x'.

<?php $res = preg_replace('#a.+x#', '!', $str); ?>

Nous nous attendons à ce que la variable contienne la chaîne '! zzz x kkk'. Cependant, ce n'est pas le cas - la variable contient la chaîne '! kkk'.

Tout est une question de comportement : notre regex cherche tous les caractères de la lettre 'a' à la lettre 'x'. Mais dans notre chaîne, il y a deux lettres 'x'. À cause de la gourmandise, la regex cherche jusqu'au dernier 'x', capturant ainsi autre chose que ce que nous attendions.

Bien sûr, ce comportement est souvent ce dont nous avons besoin. Mais dans ce cas précis, nous aimerions annuler la gourmandise et dire à la regex de chercher jusqu'au premier 'x'.

Pour limiter la gourmandise, il faut mettre un point d'interrogation après l'opérateur de répétition :

<?php $res = preg_replace('#a.+?x#', '!', $str); ?>

La gourmandise peut être limitée pour tous les opérateurs de répétition, comme ceci : *?, ?? et {}?.

Soit la chaîne :

<?php $str = 'aba accca azzza wwwwa'; ?>

Écrivez une expression régulière qui trouvera toutes les chaînes délimitées par la lettre 'a', et remplacera chacune d'elles par '!'. Entre les lettres a, il peut y avoir n'importe quel caractère (sauf 'a').

Français
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Nous utilisons des cookies pour le fonctionnement du site, l'analyse et la personnalisation. Le traitement des données est effectué conformément à la Politique de confidentialité.
accepter tout personnaliser refuser