Oui, les revoilà. Nous avons vu précédemment comment utiliser les références arrières au sein d'une expression pour faire référence à un élément capturé.
Avec la fonction preg_replace(), les références arrières peuvent aussi être utilisées dans la chaîne de remplacement. Elles sont notées \\n (double backslash suivi du numéro de capture).

Comme exemple d'utilisation nous prendrons "l'effet stabilo" que vous avez déjà sans doute rencontré quand vous recherchez un mot, et que toutes les occurrences trouvées dans une page sont signalée par un fond de couleur.

Nous prendrons le texte :
"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)."
On recherche "expression" et on veut obtenir :
"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). "

La réalisation est très simple : il suffit d'entourer le mot recherché par des balises de style comme
<span style="background-color: yellow">expression</span>
Ici l'expression régulière n'a rien de compliqué, mais elle peut être aussi complexe que l'on souhaite. L'important est de bien entourer l'élément recherché avec des parenthèses pour qu'on puisse y faire référence dans la chaîne de remplacement.
L'expression :
/\b(expression)/i
La chaîne de remplacement :
' <span style="background-color: yellow">\\1</span>'

Exemple : remplacement de références arrières
<?php require('bib_fonctions.php'); htmlDebut('Remplacement de références arrières'); $txt = "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)."; $exp = '/\b(expression)/i'; $r = '<span style="background-color: yellow">\\1</span>'; $txt = preg_replace($exp, $r, $txt); echo $txt; htmlFin(); ?>

Pour "stabiloter" tout le terme quand il est au pluriel, on pourrait utiliser l'expression régulière : /\b(expression[s]?)/i

L'exemple suivant prend les adresses email contenues dans un texte et les transforme en liens mailto cliquables.

Le texte "Vous pouvez écrire à francois.piat@univ-fcomte.fr ou à fpiat@femto-st.fr pour féliciter l'auteur de ce cours.

est transformé en
"Vous pouvez écrire à <a href="mailto:francois.piat@univ-fcomte.fr">francois.piat@univ-fcomte.fr</a> ou à <a href="mailto:fpiat@femto-st.fr">fpiat@femto-st.fr</a> pour féliciter l'auteur de ce cours."

Comme l'expression régulière contient des sous-captures entre parenthèses, nous devons utiliser \\0 comme numéro de référence arrière pour récupèrer l'ensemble de la capture. Si nous utilisions \\1 nous n'aurions que la chaîne avant le caractère @, et si nous utilisions \\2 nous n'aurions que la chaîne après.

Exemple : remplacement de références arrières
<?php require('bib_fonctions.php'); htmlDebut('Remplacement de références arrières'); $exp = '/([a-z][\w\-\.]*)@([a-z][\w\-\.]*)\.([a-z]{2,6})/i'; $r = '<a href="mailto:\\0">\\0</a>'; $txt = "Vous pouvez écrire à francois.piat@univ-fcomte.fr ou à fpiat@femto-st.fr pour féliciter l'auteur de ce cours."; $txt = preg_replace($exp, $r, $txt); echo $txt; htmlFin(); ?>

On peut travailler avec plusieurs références arrières comme dans l'exemple suivant qui prend une date au format aaaa/mm/jj et qui la met au format jj/mm/aaaa.

Comme le caractère / est utilisé dans l'expression régulière, les délimiteurs seront ici caractères #.

Exemple : remplacement de références arrières
<?php require('bib_fonctions.php'); htmlDebut('Remplacement de références arrières'); $txt = "From: rasmus@io.org (Rasmus Lerdorf) Subject: Announce: Personal Home Page Tools (PHP Tools) Date: 1995/06/08 Message-ID: <3r7pgp$aa1@ionews.io.org>#1/1 organization: none newsgroups: comp.infosystems.www.authoring.cgi Announcing the Personal Home Page Tools (PHP Tools) version 1.0."; $exp = '#(\d{4})/(\d{2})/(\d{2})#'; $txt = preg_replace($exp, '\\3/\\2/\\1', $txt); echo '<pre>', $txt, '</pre>'; htmlFin(); ?>

Très utile : une fonction qui transforme une date aaaammjj en date de la forme jj/mm/aaaa :
function amj_jma($date) {
return preg_replace('/(\d{4})(\d{2})(\d{2})/', '\\3/\\2/\\1', $date);
}