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>'
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.
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 #.
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);
}