Général

Les PCRE

Les POSIX

Pratique

Linux

Spécial php

Les billets de fred

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.

Qu'est ce qu'une assertion ?

Une assertion est un test, un sous-masque qui permet de vérifier certains éléments dans le masque de la regex. Le mieux serait de suivre les articles sur le sujet : Voir le tuto : >>> Les assertions
ADAM Benjamin 2008 | Admin