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 :

- déterminer si une chaîne est conforme à un modèle (par exemple une adresse email, un nombre avec 4 décimales, un numéro de carte de crédit, etc),
- extraire des parties de la chaîne conformes au modèle,
- découper une chaîne suivant un modèle complexe (par exemple les differentes parties d'un texte selon des caractères de ponctuation variés),
- remplacer les instances du modèle par d'autres caractères (par exemple mettre le premier caractère de tous les mots d'une chaîne en minsucule).

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.

### Syntaxe générale d'une expression régulière

syntaxe d'une expression régulière

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.

Exemple : expression régulière simple
<?php ob_start(); require('bib_fonctions.php'); htmlDebut('Expression régulière'); $txt = "Il y a bien longtemps, dans une très lointaine galaxie (36éme lune à gauche après le Djedaille's Bar)..."; htmlInfo('Recherche "il"'); testerExp('/il/', $txt); htmlInfo('Recherche "Il"'); testerExp('/Il/', $txt); htmlInfo('Recherche "il", "Il", "iL" et "IL"'); testerExp('/il/i', $txt); htmlFin(); ?>

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);
    }