Savez-vous prendre avantage du lookahead dans une expression régulière ? D'abord, qu'est-ce que c'est ? Le lookahead est un mécanisme d'assertion qui permet de regarder les caractères qui suivent pour voir s'il y a correspondance, sans toutefois les conserver dans le résultat retourné.
Par exemple, dans l'extrait de phrase suivant :
1èrement, je voudrais annoncer le gagnant du 1er prix...
Si on voulait remplacer "1er" pour qu'il devienne "1er" (avec la balise HTML SUP), on devrait utiliser une expression régulière qui vérifie s'il s'agit d'un chiffre, suivi du terme "er" et sa forme au féminin "ère".
(\d+)(er|ère)
Par contre, on voudra s'assurer que le mot est complet et qu'il ne remplace pas une partie du mot original car on ne veut pas que "1èrement" soit transformé en "1èrement". Dans les faits, on pourrait simplement utiliser le flag \b qui vérifie la limite d'un mot, mais pour les fins de mon exemple, je ferai exprès pour démontrer comment on le fait avec la technique du lookahead.
La regex avec le word boundary vérifie que la limite d'un mot est atteinte mais ne conserve pas l'espace qui suivrait.
(\d+)(er|ère)\b
Pour vérifier s'il y a un espace, on remplacera \b par \s à la fin de l'expression.
(\d+)(er|ère)\s
Le problème est qu'on veut vérifier la présence de l'espace, mais sans le conserver au moment du remplacement. C'est ici que le lookahead entre en jeu :
(\d+)(er|ère)(?=\s)
La syntaxe du lookahead est (?=regex). L'expression régulière qui suit ?= indiquera qu'il faut que ce qui s'en vient soit un "whitespace character", mais de ne pas le retenir dans la correspondance.
En PHP, les lignes suivantes feront le travail :
$regex = '/(\d+)(er|ère)(?=\s)/i';Le résultat :
$replace = '$1<sup>$2</sup>';
$sentence = '1èrement, je voudrais annoncer le gagnant du 1er prix...';
echo preg_replace($regex, $replace, $sentence);
1èrement, je voudrais annoncer le gagnant du 1<sup>er</sup> prix...
À noter qu'il existe aussi le lookahead négatif où la regex doit être fausse, qui utilise l'opérateur ?!.