La fonction preg_replace_callback() permet d'utiliser une fonction pour effectuer le remplacement des chaînes concordantes avec le modèle. preg_replace_callback() accepte trois paramètres :

- une expression régulière,
- le nom de la fonction a exécuter pour faire le remplacement,
- la chaîne sur laquelle travailler.

La fonction qui effectue le remplacement reçoit en paramètre le texte à remplacer sous la forme d'un tableau. L'élément 0 du tableau contient toute la chaîne trouvée, les éléments suivants correspondent aux parenthèse capturantes éventuellement utilisées.

L'utilisation d'une fonction pour faire des remplacements peut être interressante par exemple quand on a à gérer un site avec des fonctionnalités utilisant un BBCode (Bulletin Board Code) ou une syntaxe wiki, qui permettent à l'utilisateur de saisir facilement des instructions de mise en forme (**gras** plutôt que <b>gras</b>) ou de faire des liens ([url]www.univ-fcomte.fr[/url] sera traduit par <a href="http://www.univ-fcomte.fr">www.univ-fcomte.fr</a>). On filtre donc le texte saisi puis on remplace certaines parties par du code HTML permettant un affichage "correcte" dans un navigateur.

Notre exemple gérera les remplacements suivants :

- [url]adresse[/url] devient <a href="adresse">adresse</a>
- [img]adresse[/img] devient <img src="adresse">
- **texte** devient <b>texte</b>
- *n*Titre*n* devient <hn>Titre</hn> (n variant de 1 à 6)

Exemple : remplacement par fonction
<?php require('bib_fonctions.php'); htmlDebut('Remplacement par fonction'); // Tableau des expressions à remplacer $exp = array(); $exp[] = '/\[(url|img)\](.+?)\[\/\1\]/i'; $exp[] = '/(\*\*)(.+?)\1/i'; $exp[] = '/(\*\d\*)(.+?)\1/i'; // Texte $txt = '*4*Bonjour*4* Je suis **ton père** [img]dv.gif[/img]. [url]www.dark-vador.net[/url]'; // Remplacement $html = preg_replace_callback($exp, 'remplacer', $txt); echo $html; htmlFin(); //====================================================== function remplacer($x) { // Pour voir ce qui est passé à la fonction // décommentez la ligne suivante // infoTableau($x); // Remplacements if ($x[1] == 'url') { return '<a href="http://'.$x[2].'">'.$x[2].'</a>'; } if ($x[1] == 'img') { return '<img src="'.$x[2].'">'; } if ($x[1] == '**') { return '<b>'.$x[2].'</b>'; } return preg_replace('/\*(\d)\*(.+?)\*(\d)\*/', '<h\\1>\\2</h\\3>', $x[0]); } ?>

L'exemple suivant met en majuscule et en rouge tous les tags HTML contenus dans une chaîne.

Exemple : remplacement par fonction
<?php require('bib_fonctions.php'); htmlDebut('Remplacement par fonction'); // texte en heredoc $txt = <<<_HTML_ <br> <table border="0" cellspacing="0" cellpadding="0" width="460" align="center"> <tr> <td> <p>Pendant que nous sommes dans les tags HTML, voilà l'expression réguliére qui permet de capturer tous les tags HTML, qu'ils aient ou non des attributs :<br> <span class="code"><\s*?(\w+)\b*?></span></p> </td> </tr> </table> <a name="2"></a> _HTML_; $exp = '#<\s*?(/?)\s*?(\w+)(\b.*?)>#s'; $html = preg_replace_callback($exp, 'remplacerTag', $txt); echo '<pre>', $html, '</pre>'; htmlFin(); //===================================================== function remplacerTag($x) { return '&lt' // le signe < .$x[1] // le / si tag de fin .'<span style="color:red">' // le tag en rouge .strtoupper($x[2]) // le tag en majsucule .'</span>' .$x[3] // les attributs éventuels .'&gt'; // le signe > } ?>