Général
- Présentation
- Les Symboles
- Les Métacaractères
- Les Ancres et Classes
- Les options
- Constantes prédéfinies
- Equivalences
- Créer un motif
- Les POSIX
- Les PCRE
- Les Plus des PCRE
- Les Assertions Part I
- Les Assertions Part II
- Motif conditionnel
- Mysql et les regex
- Url Rewriting
- Optimisation
- Aide mémoire
Les PCRE
Les POSIX
Pratique
Linux
Spécial php
- Conseils et Astuces
- Délimiteur PCRE
- Créer une bdd
- Utiliser du BBcode
- Le binaire
- Faire un panier
- Cases à cocher
- Citations imbriquées
- Colorateur syntaxique
- Les list-box ou combo-box
- Faire un diaporama
- Isset ou empty ?
- Une légende au survol
- Site en plusieurs langues
- Requêtes dynamiques
- Gestion des smiley
- Faire un moteur de template
- Timestamp php/mysql
- Timestamp mysql
- Matcher une adresse email
- Controler des données
Les billets de fred
- Les POSIX... mise en pratique !
- Limiter l'accès à un répertoire
- Alternance de couleurs
- Magic_quotes
- Désactiver les short_tags
- Require ou include : Bench
- Cohérence dans les chaines de caractères
- "echo" : lapin ou tortue ?
- Gérer un formulaire avec plusieurs boutons
- Le formulaire a t'il été soumis ?
- J'ai décidé de grossir
- La guerre des étoiles
- La guerre des boutons
- Headers already sent
- IP, IP, IP, houra !
- Créer un itérateur avec PHP5
- On vous conduit vers la lumière
- Comment utiliser MySQL avec PHP
- Non aux booléens !
- Php.ini : dist /recommended
- Include : gouffre ou fêlure ?
- Simple comme les sessions !
- Simplifier le traitement des erreurs
- Structurez vos applications
- Franchement, t'es trop for !
- Notice: Undefined variable (ou index)
- Proscrire les variables auto déclarées
Les POSIX... mise en pratique !
Pour rappel, les motifs sont réalisés au moyen de symboles spécifiques : [ Symboles ]Dans cette partie de cours je vais vous présenter en détail les éléments vous permettant de comprendre la création d'un motif de recherche. Je vais travailler ici avec les fonction POSIX ereg et eregi.
Description des motifs
Ces exemples sont complémentaires de ceux utilisés sur la page POSIX.
On peut décrire la composition d'un motif selon le schéma suivant :
- les éléments tels que caractères, chaînes et classes.
- le nombre d'apparition
- la position dans le motif
- les alternatives
Nous utiliserons la fonction ereg()
1) Un motif simple, une chaîne
Exemple :ereg('chien','Mon animal favori est le chien');
Cet exemple renvoie VRAI (true) car le motif 'chien' est présent dans la chaîne sujet.
Cet exemple aurait également pu être formulé de cette façon :
<?php
$chaine='Mon animal favori est le chien';
$motif='chien';
ereg($motif,$chaine);
?>
Un autre exemple :
<?php
$chaine='Les Regex par la pratique';
$motif='regex';
ereg($motif,$chaine);
?>
Cet exemple renvoie FAUX (false) car le motif 'regex' n'a pas été trouvé dans la chaîne.
Mais si, me direz-vous, il est bien dans la chaîne !
En effet, il est bien là mais l'expression ne l'a pas reconnu.
D'où vient le problème alors ?
Simple... les expressions régulières sont sensibles à la casse.
Regex et regex bien qu'identique dans leur sens littéral sont pourtant deux mots différents dans leur mode d'écriture.
Les fonction ereg, ereg_replace et split ont un équivalent qui les rend insensibles à la casse : eregi, eregi_replace et spliti.
Donc, pour que notre exemple précédent renvoie VRAI il fallait écrire l'expression comme ceci :
<?php
$chaine='Les Regex par la pratique';
$motif='regex';
eregi($motif,$chaine);
?>
Vous comprenez que cela dépend effectivement de ce que l'on recherche au niveau de la chaîne de caractères.
En gardant toujours le même exemple, on peut également arriver au même résultat en créant une alternative (un OU si vous préférez)
2) L'alternative dans le motif
<?php$chaine='Les Regex par la pratique';
$motif='regex|Regex|REGEX';
ereg($motif,$chaine);
?>
Cette méthode renvoie VRAI car l'expression trouvera au moins un des éléments donnés au niveau du motif, soit regex ou Regex ou REGEX.
Voilà, on garde notre exemple, mais en plus on veut afficher le terme trouvé.
Les fonctions de regex permettent d'y adjoindre un argument optionnel tel qu'un tableau.
Exemple :
<?php
$chaine='La REGEX est un outil formidable';
$motif='regex|Regex|REGEX';
ereg($motif,$chaine,$regs);
foreach($regs as $terme)
{
echo $terme.'<br />';
}
?>
Cette recherche affichera le mot trouvé soit : REGEX
Nous allons créer des motifs qui permettent des recherches tant générales que spécifiques en utilisant les symboles de classes, les parenthèses, etc...
Pour rappel : [ Symboles ]
Exemple : rechercher les voyelles dans une chaîne
<?php
$chaine='Les Regex par la pratique';
$motif='[aeiouy]';
ereg($motif,$chaine);
?>
Cet exemple renvoie VRAI puisque la chaîne contient au moins une des voyelles définies dans le motif.
Exemple : toujours avec des lettres on va créer une classe (une plage de caractères)
<?php
$chaine='Les Regex... une merveille !';
$motif='[a-d]';
ereg($motif,$chaine);
?>
Cet exemple renvoie FAUX puisque la chaîne ne contient aucune de lettres définies dans le motif, alphabet de 'a' à 'd'
Exemple : toujours dans la même logique, on va chercher des chiffres
<?php
$chaine='Les Regex... une merveille !';
$motif='[0-9]';
ereg($motif,$chaine);
?>
Cet exemple renvoie FAUX puisque la chaîne ne contient aucun chiffre défini dans le motif, chiffre de '0' à '9'
Exemple : on garde nos chiffres mais on inverse la logique, on va demander de vérifier que la chaîne ne contient pas de chiffres, on demande une négation en somme.
pour créer la négation en utilisant le symbole ^ à l'intérieur de la classe.
<?php
$chaine='Les Regex... une merveille !';
$motif='[^0-9]';
ereg($motif,$chaine);
?>
Cet exemple renvoie VRAI puisque, effectivement, la chaîne ne contient aucun chiffre défini dans le motif.
Exemple : ci-dessous, on demande au motif de ne pas trouver de lettres, tant minuscules que majuscules, dans la chaîne
<?php
$chaine='Les Regex... une merveille !';
$motif='[^a-zA-Z]';
ereg($motif,$chaine);
?>
Cet exemple renvoie FAUX puisque, effectivement, la chaîne contient des lettres définies dans le motif.
Il est bien entendu que ceci n'est qu'un simple test car Mysql est bien capable de reproduire une date au format souhaité sans faire la moindre regex.
Date exemple : 2003-12-25 convertie en 25/12/2003.
<?php
$date='2003-12-25';
$date=ereg_replace("([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})","$3/$2/$1",$date);
echo $date;
// cette fonction affichera 25/12/2003.
?>
Comme vous le constatez, les possibilités sont multiples et il convient de créer son motif selon ce que l'on souhaite et/ou ce que l'on ne souhaite pas.
L'habitude fera que vous sentirez la direction que vous devrez prendre dans la mise en place de votre motif de recherche.
Vous avez remarqué que dans ce tuto, j'ai employé les fonctions POSIX et pas les PCRE.
Il ne s'agit bien évidement que d'un choix didactitiel et pas d'un choix de performance.
Le même tuto avec les PCRE : Cf-> PCRE en pratique
}
?>
Cette recherche affichera le mot trouvé soit : REGEX
3) Etendons la plage de recherche
Rechercher et trouver un terme spécifique comme ci-dessus est utile mais l'utilité des regex serait bien pauvre si elle ne se limitait qu'à ça.Nous allons créer des motifs qui permettent des recherches tant générales que spécifiques en utilisant les symboles de classes, les parenthèses, etc...
Pour rappel : [ Symboles ]
Exemple : rechercher les voyelles dans une chaîne
<?php
$chaine='Les Regex par la pratique';
$motif='[aeiouy]';
ereg($motif,$chaine);
?>
Cet exemple renvoie VRAI puisque la chaîne contient au moins une des voyelles définies dans le motif.
Exemple : toujours avec des lettres on va créer une classe (une plage de caractères)
<?php
$chaine='Les Regex... une merveille !';
$motif='[a-d]';
ereg($motif,$chaine);
?>
Cet exemple renvoie FAUX puisque la chaîne ne contient aucune de lettres définies dans le motif, alphabet de 'a' à 'd'
Exemple : toujours dans la même logique, on va chercher des chiffres
<?php
$chaine='Les Regex... une merveille !';
$motif='[0-9]';
ereg($motif,$chaine);
?>
Cet exemple renvoie FAUX puisque la chaîne ne contient aucun chiffre défini dans le motif, chiffre de '0' à '9'
Exemple : on garde nos chiffres mais on inverse la logique, on va demander de vérifier que la chaîne ne contient pas de chiffres, on demande une négation en somme.
pour créer la négation en utilisant le symbole ^ à l'intérieur de la classe.
<?php
$chaine='Les Regex... une merveille !';
$motif='[^0-9]';
ereg($motif,$chaine);
?>
Cet exemple renvoie VRAI puisque, effectivement, la chaîne ne contient aucun chiffre défini dans le motif.
Exemple : ci-dessous, on demande au motif de ne pas trouver de lettres, tant minuscules que majuscules, dans la chaîne
<?php
$chaine='Les Regex... une merveille !';
$motif='[^a-zA-Z]';
ereg($motif,$chaine);
?>
Cet exemple renvoie FAUX puisque, effectivement, la chaîne contient des lettres définies dans le motif.
4) Parenthèses capturantes
Pour illustrer cet exemple, on va convertir une date MYSQL au format YYYY-MM-DDIl est bien entendu que ceci n'est qu'un simple test car Mysql est bien capable de reproduire une date au format souhaité sans faire la moindre regex.
Date exemple : 2003-12-25 convertie en 25/12/2003.
<?php
$date='2003-12-25';
$date=ereg_replace("([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})","$3/$2/$1",$date);
echo $date;
// cette fonction affichera 25/12/2003.
?>
Comme vous le constatez, les possibilités sont multiples et il convient de créer son motif selon ce que l'on souhaite et/ou ce que l'on ne souhaite pas.
L'habitude fera que vous sentirez la direction que vous devrez prendre dans la mise en place de votre motif de recherche.
Vous avez remarqué que dans ce tuto, j'ai employé les fonctions POSIX et pas les PCRE.
Il ne s'agit bien évidement que d'un choix didactitiel et pas d'un choix de performance.
Le même tuto avec les PCRE : Cf-> PCRE en pratique
