Lookahead dans les expressions régulières PHP
Parfois, il faut résoudre un problème de ce type : trouver
la chaîne 'aaa' et la remplacer par '!',
mais seulement si après 'aaa' se trouve
'x', sans remplacer 'x' lui-même.
Si nous essayons de résoudre le problème
directement, nous n'y arriverons pas :
<?php
preg_replace('#aaax#', '!', 'aaax'); // donnera '!', mais il faut '!x'
?>
Pour résoudre le problème, il faut un moyen de dire
que 'x' ne doit pas être remplacé. Cela
se fait à l'aide de parenthèses spéciales (?= ),
qui vérifient simplement sans capturer.
Ces parenthèses sont appelées lookahead positif.
Positif - car 'x'
(dans notre cas) doit être présent - alors seulement
le remplacement aura lieu.
Utilisons ces parenthèses pour résoudre notre problème :
<?php
preg_replace('#aaa(?=x)#', '!', 'aaax'); // retournera '!x'
?>
Il existe aussi le lookahead négatif
- (?! ) - il dit, au contraire, que
quelque chose ne doit pas être présent. Dans l'exemple suivant,
le remplacement aura lieu seulement si après 'aaa'
ne se trouve pas 'x' :
<?php
preg_replace('#aaa(?!x)#', '!', 'aaab'); // retournera '!b'
?>
Une chaîne contenant des noms de fonctions est donnée :
<?php
$str = 'func1() func2() func3()';
?>
Obtenez un tableau des noms de fonctions à partir de la chaîne.
Une chaîne avec une balise est donnée :
<?php
$str = '<a href="" class="eee" id="zzz">';
?>
Obtenez un tableau des noms des attributs de cette balise.