Il arrive souvent que l'on travaille sur des chaînes de caractères
complexes, et que les fonctions fournies par PHP pour découper,
extraire, comparer les chaînes ne soient pas suffisantes.
Une opération de recherche et de remplacement classique demande que
l'on connaisse le texte exact correspondant à la recherche ou à la
vérification à effectuer. Cela peut être suffisant pour des
opérations de recherche et de remplacement simples dans du texte
statique, mais très difficile, voire impossible, avec un texte
compliqué ou un texte dynamique. On peut alors utiliser les mécanismes
des expressions régulières (aussi appelées expressions
rationnelles).
Une expression régulière permet de définir un modèle général (ou motif) et de comparer une chaîne de caractères à ce modèle. On pourra ainsi par exemple :
La complexité des modèles varie de la simplicité évidente aux combinaisons les plus raffinées. Un modèle pourrait être par exemple de rechercher si une chaîne commence par A ou par B, suivi de 5 à 7 chiffres et se terminant par x ou w. Un autre modèle pourrait permettre la recherche de l'adjectif 'bon', à l'exclusion des mots contenant ces 3 lettres ('bonjour', 'bondir', 'bonbon' ...) mais en prenant les déclinaisons de l'adjectif ('bons', 'bonne', 'bonnes', ..). Bien sûr, sans les expressions régulières, ces traitements seraient quand même possibles, mais au prix de l'écriture d'un algorithme de traitement plus ou moins compliqué et plus ou moins sûr.
PHP permet de travailler avec 2 mécanismes d'expressions
régulières : les expressions régulières POSIX et les
expressions régulières PCRE (Perl Compatible Regular
Expression).
Les expressions régulières POSIX sont obsolètes
et on utilise maintenant les expressions régulières PCRE. Ce chapitre
parle donc uniquement des expressions régulières de type PCRE
(les spécifications techniques sont consultables sur http://www.pcre.org/pcre.txt).
Les explications contenues dans les premières pages de ce chapitre sont valables pour toutes les implémentations des expressions régulières, que ce soit dans des langages comme PHP, Java, C++, Perl, JavaScript, ou que ce soit dans des systèmes comme Unix ou Linux avec des outils comme grep, sed, awk ou vi.
Une expression régulière est un modèle de texte (ou motif) constitué de caractères ordinaires (par exemple les lettres de a à z, ou les nombres de 1 à 9) et de caractères spéciaux, appelés métacaractères.
La construction d'expressions régulières est similaire à celles des expressions arithmétiques : divers métacaractères et opérateurs peuvent combiner des petites expressions pour en créer des plus grandes.
Le modèle défini par l'expression régulière doit être entouré de délimiteurs. N'importe quel caractère peut être utilisé comme délimiteurs, mais les délimiteurs les plus couramment employés sont /, # ou ~.
Le délimiteur de fin peut être suivi d'options.
Pour tester les exemples nous utiliserons la fonction testerExp() qui se trouve dans notre bibliothéque bib_fonctions.php. Cette fonction est faite pour que nous ayons un retour visuel sur les expressions régulières testées.
Le code de la fonction testerExp().
/**
* Test et affichage du résultat d'une expression régulière
*
* @param string $exp Expression régulière
* @param string $txt Texte sur lequel appliquer l'expression
*/
function testerExp($exp, $txt) {
// on découpe le texte suivant l'expression régulière
$t = preg_split($exp, $txt);
// on affiche le résultat
echo '<h5>Le modèle <span class="exp">', $exp, '</span> ',
'a été trouvé ', (count($t) - 1), ' fois</h5>',
preg_replace($exp,
'<span class="exp">$0</span>',
$txt);
}