Envoyé par unreal
Les expressions régulières ou "RegEx" permettent de localiser (et remplacer) des séquences contenant des valeurs inconnues, mais qui suivent une certaine logique.
Pour bien situer l'utilité, voici un problème qui pourrait être résolu grâce à des RegEx : vous avez une chaîne contenant une date au format US (YYYYMMDD) que vous voulez afficher au format européen (DD/MM/YYYY).
Les fonctions
Les 2 fonctions que vous allez le plus souvent utiliser sont ereg_replace (detection et remplacement des regex) et ereg (detection seulement).
Pour la syntaxe des fonctions, tout est expliqué en détail sur le site du php.
Les caractères spéciaux
Ci-dessous la liste des caractères spéciaux et leurs rôles :
Reprenons l'exemple donné en introduction
Il s'agit de détecter des groupes de chiffres allant de 0 à 9, soit [0-9]. Il peut avoir 2 ou 4 chiffres dans chaque groupe, soit [0-9]{2} ou [0-9]{4}.
Donc [0-9]{4}[0-9]{2}[0-9]{2} permettrait de détecter la date.
Mais nous avons besoin de récupérer les séquences de chiffres de chaque groupe pour inverser l'ordre, soit ([0-9]{4})([0-9]{2})([0-9]{2}).
A partir de là prenons 2 cas de figure :
1/ La date est en fin de chaîne, après une partie connue, par exemple "date20050531". On pourrait donc détecter de cette manière :
"date([0-9]{4})([0-9]{2})([0-9]{2})$" <-- le $ indique la fin de chaîne
2/ La date a des lettres de chaque côté, par exemple "blabla20050531abc". Il faudrait alors procéder de cette manière :
".*([0-9]{4})([0-9]{2})([0-9]{2}).*" <-- les .* matchent n'importe quels caractères
Pour le remplacement, utilisons la fonction ereg_replace :
Note : les \\1, \\2 et \\3 contiennent les séquences reconnues.
Conclusion
Il est important de ne pas abuser des RegEx qui sont puissantes mais lourdes en temps processeur. Quand vous n'avez besoin que de remplacer des chaînes connues, il convient d'utiliser la fonction str-replace qui est carrément plus rapide.
Voilà, je mettrai en ligne d'autres guides quand je les aurai fait.
Pour bien situer l'utilité, voici un problème qui pourrait être résolu grâce à des RegEx : vous avez une chaîne contenant une date au format US (YYYYMMDD) que vous voulez afficher au format européen (DD/MM/YYYY).
Les fonctions
Les 2 fonctions que vous allez le plus souvent utiliser sont ereg_replace (detection et remplacement des regex) et ereg (detection seulement).
Pour la syntaxe des fonctions, tout est expliqué en détail sur le site du php.
Les caractères spéciaux
Ci-dessous la liste des caractères spéciaux et leurs rôles :
- . : n'importe quel caractère
- ^ : début de chaîne
- $ : fin de chaîne
- * : >=0 occurrences des caractères
- + : >0 occurrences des caractères
- ? : 0 ou 1 occurrences des caractères
- (...) : séquence de caractères
- [...] : caractères à apparaître dans une séquence de caractères
- {x} ou {x,y} : nombre d'occurrences de caractères
- | : fonction logique "ou"
- \ : caractère "escape", permet d'utiliser un caractère spécial littéralement
Reprenons l'exemple donné en introduction
Il s'agit de détecter des groupes de chiffres allant de 0 à 9, soit [0-9]. Il peut avoir 2 ou 4 chiffres dans chaque groupe, soit [0-9]{2} ou [0-9]{4}.
Donc [0-9]{4}[0-9]{2}[0-9]{2} permettrait de détecter la date.
Mais nous avons besoin de récupérer les séquences de chiffres de chaque groupe pour inverser l'ordre, soit ([0-9]{4})([0-9]{2})([0-9]{2}).
A partir de là prenons 2 cas de figure :
1/ La date est en fin de chaîne, après une partie connue, par exemple "date20050531". On pourrait donc détecter de cette manière :
"date([0-9]{4})([0-9]{2})([0-9]{2})$" <-- le $ indique la fin de chaîne
2/ La date a des lettres de chaque côté, par exemple "blabla20050531abc". Il faudrait alors procéder de cette manière :
".*([0-9]{4})([0-9]{2})([0-9]{2}).*" <-- les .* matchent n'importe quels caractères
Pour le remplacement, utilisons la fonction ereg_replace :
<?php
$str = 'blabla20050531abc';
$str = ereg_replace('.*([0-9]{4})([0-9]{2})([0-9]{2}).*', '\\3/\\2/\\1', $str);
echo ($str);
?>
$str = 'blabla20050531abc';
$str = ereg_replace('.*([0-9]{4})([0-9]{2})([0-9]{2}).*', '\\3/\\2/\\1', $str);
echo ($str);
?>
Note : les \\1, \\2 et \\3 contiennent les séquences reconnues.
Conclusion
Il est important de ne pas abuser des RegEx qui sont puissantes mais lourdes en temps processeur. Quand vous n'avez besoin que de remplacer des chaînes connues, il convient d'utiliser la fonction str-replace qui est carrément plus rapide.
Voilà, je mettrai en ligne d'autres guides quand je les aurai fait.
Posté le 01/06/05 à 02:23