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
Le bon délimiteur pour les PCRE
Dans cet article, je vais vous parler de mon choix du délimiteur des PCRE.Bonne idée Yves, dis-nous pourquoi tu utilises un truc idiot tel que
l'accent grave ` (back-quote)
C'est très simple en fait :
- Il faut éviter d'utiliser un caractère qui risque de se retrouver dans le motif et que l'on devra alors échapper.Dans la Doc Php, on peut trouver ceci :
La syntaxe des masques utilisés dans ces fonctions ressemble fort à celle de Perl.
Les expressions seront entourées de délimiteurs, slash (/), par exemple.
N'importe quel caractère peut servir de délimiteur, tant qu'il n'est pas alpha-numérique ou n'est pas un anti-slash (\).
Si un délimiteur doit être utilisé dans l'expression, il faudra l'échapper avec un anti-slash.
Depuis PHP 4.0.4, vous pouvez utiliser les délimiteurs (), {}, [], et <>, comme en Perl.
Personnellement, je ne suis pas du tout d'accord, je dirais même que c'est à éviter et je m'explique.
Je cite :
N'importe quel caractère peut servir de délimiteur, tant qu'il n'est pas alpha-numérique ou n'est pas un anti-slash (\).
Au début de ma découverte des expressions régulières, je n'aurais pas mis en doute ce genre d'affirmation, car ne connaissant pas toutes les options, je ne pouvais l'appréhender.
Aujourd'hui, j'ose le dire : C'est totalement FAUX !
Et zou, Yves a encore pêter un câble et le voilà qu'il met en doute la publication officielle de la doc Php.
Faut absolument le calmer ce garçon... un aspro, un supo et hop... au dodo.
Imaginez la tête d'une regex avec ses antislashes partout avec <> comme délimiteurs ?
echo preg_replace('<\<[^\<]*\>>', '', $ch);
Redevenons sérieux !
Les métacaractères par exemple. L'emploi d'un métacaractère, qui dans un motif d'expression à une signification et une fonction particulière, peut très bien être utilisé. (>>> cf -> Qu'est ce qu'un métacaractère ?)
Exemple :
<?php
$str='texte';
if(preg_match('$\w$',$str)){echo 'TRUE';}else{echo 'FALSE'}
?>
Cet exemple affichera TRUE.
Reprenons-le et changeons le motif \w par \d :
<?php
$str='texte';
if(preg_match('$\d$',$str)){echo 'TRUE';}else{echo 'FALSE'}
?>
Cette fois on affichera FALSE car la chaine ne contient pas de chiffres.
Donc ça marche !
Oui bien évidemment, mais comme on l'a vu dans les cours, le symbole $ est aussi utilisé pour délimiter la fin de la chaine sujet. (ancrage, comme le ^ qui marque le début de la chaine)
Bah, il suffit simplement de l'échapper alors !
Hé non, c'est là que ça se gâte, un métacaractère est échappé uniquement lorsque l'on veut l'employer comme littéral à l'intérieur du masque. Donc, cela n'aura aucun effet.
Conclusion, on ne peut absolument pas utiliser n'importe quel caractère comme délimiteur.
Certains me diront, c'est simple, on ne prendra (comme dit dans les cours) aucun métacaractère comme délimiteur.
Je ne peux que vous dire : Bravo !
Mais cela va encore plus loin !
J'ai eu l'occasion de trouver des tutos qui préconisaient, dans une série d'exemples, l'emploi du point d'exclamation, qui lui, n'est pas un métacaractère. (quoi que...)
Non, en effet, ce n'en est pas un, il n'est pas repris en temps que tel dans la doc php.
Et pourtant...
On pourrait penser qu'au moment de la rédaction de cet article de la Doc Php, les auteurs ont dû zapper un élément important : les assertions !
On pourrait encore penser que cet article de la Doc Php ne se rapportait qu'au POSIX dans lesquels, le point d'exclamation n'a absolument aucune signification particulière.
Bref, j'en viens au fait : utiliser le point d'exclamation n'est pas un choix judicieux du tout, je dirais même que c'est une erreur grossière, car le ! est utilisé dans les assertions.
