Exemple d’expressions régulières (ereg, ereg_replace)
Exemple et syntaxe d'une expression régulière
Vous vous êtes demandez pourquoi on apprend les expressions régulières, quel est donc l'utilité ?
En regardant l'exemple ci-dessus vous seriez en mesure de répondre à cette question.
Cet exemple a été extrait d'un traitement de texte d'un mail sur un site multilingue. Voici l'extrait du contenu du mail en HTML.
##Bonjour##,
##Vous êtes désormais inscrit sur le site##.
##Voici vos codes d'accès## :
##Identifiant##: {email}
##Mot de passe## : {motdepasse}
Le code suivant recherche tous les textes entouré d'une "##" dans un texte de mail, et les remplace par les traductions correspondantes tout en enlevant les "##". Il faut relever tous les textes à traduire en excluant les balises HTML et tout la mise en forme. On entoure donc d'une double dièze "##" pour dire que c'est un texte à traduire.
Supposons qu'une fonction traduction() effectue la traduction des mots français en anglais. Ainsi : traduction ("Bonjour") pourra renvoyer "Hello". La variable $mail contient tout le contenu du mail :
Exemple Code 1
<?php while(!($debut== false)) { $fin=strpos($mail, "##",$debut+2); if (!($fin== false)) { $texte = substr($mail,$debut,$fin-$debut+2); $traduction = substr($mail,$debut+2,$fin-$debut-2); $traduction = t($traduction); $mail = str_replace($texte, $traduction, $mail); $debut = strpos($mail, "##", 0); } else { $debut=false; } ?>
Voici une autre version qui fait la même chose mais utilisant les expressions régulières. $out est un tableau renvoyé par la fonction preg_match_all.
Exemple Code 2
<?php preg_match_all ("#[##^####][##](.*?)[##][##]#i", $mail, $out); foreach($out[0] as $k => $v) { $texte = t($out[1][$k]); $mail = str_replace ($v, $texte,$mail); } echo $mail ; ?>
En ne comparant que le nombre de lignes de code, on peut déjà voir la grande utilité des expressions régulières.
Par la suite nous vous proposons quelques fonctions de bases pour la manipulation avec des expressions régulières.
Les fonctions ereg et eregi
La fonction ereg() est à utiliser tel que :
Booleen ereg(chaîne modele, chaîne texte[,tableau])
Elle recherche dans la chaîne texte les séquences de caractère qui correspondent au modèle qui est une expression régulière. Le troisième argument est optionnel, mais quand il est défini, il permet de stocker toutes les occurrences trouvées dans un tableau.
On passe alors en troisième argument le nom du tableau en question. Lorsque la fonction trouve des occurrences de chaine de caractères, elle renvoie TRUE, sinon elle retourne FALSE.
La fonction eregi() dont la signature est pareille, effectue le même travail que ereg().La seule différence est le fait qu'elle n'est pas sensible à la casse. Autrement dit, la fonction eregi() ne fait pas de différence entre les minuscules et majuscules.
Exemple
L'exemple suivant prend une date au format ISO (YYYY-MM-DD) et l'affiche sous la forme DD.MM.YYYY. Chaque élément du tableau $regs correspond à une partie de la date.
<?php $date="2008-01-26"; if (ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs)) { echo "$regs[3].$regs[2].$regs[1]"; } else { echo "Format invalide : $date"; } ?>
Les fonctions ereg_replace et eregi_replace
La fonction ereg_replace() permet de faire la même chose que la fonction ereg(), c'est-à-dire trouver des occurrences de chaines de caractère qui correspondent au modèle. Mais en plus elle permet aussi de remplacer les occurrences par une chaîne de remplacement.
Sa syntaxe est la suivante :
- chaîne ereg_replace(chaîne modele,chaîne remplacement,chaîne texte)
- eregi_replace() fonctionne de la même façon sauf qu'il est insensible à la casse