par
Ripat » 19 févr. 2007, 17:50
Par contre, il y a juste un petit truc que je n'ai pas compris: pourquoi ne pas échapper les caractères < et >? D'après l'explication de preg_quote, ils sont utilisés dans les regex, donc je pensais qu'il fallait les échapper.
Allez, comme je n'interviens plus très souvent sur ce forum, je me fends d'une longue explication.
< et > ne font pas partie des méta-caractères des pcre. Mais, effectivement, preg_quote les échappe pour une raison que j'ignore. Voici la liste officielle des méta-caractères:
\ general escape character with several uses
^ assert start of string (or line, in multiline mode)
$ assert end of string (or line, in multiline mode)
. match any character except newline (by default)
[ start character class definition
| start of alternative branch
( start subpattern
) end subpattern
? extends the meaning of (
also 0 or 1 quantifier
also quantifier minimizer
* 0 or more quantifier
+ 1 or more quantifier
also "possessive quantifier"
{ start min/max quantifier
Part of a pattern that is in square brackets is called a "character
class". In a character class the only metacharacters are:
\ general escape character
^ negate the class, but only if the first character
- indicates character range
[ POSIX character class (only if followed by POSIX
syntax)
] terminates the character class
http://www.pcre.org/pcre.txt
Quant aux délimiteurs, on peut y mettre tout caractère non alpha-numérique. Php y rajoute quelques bizarreries comme (xxxx) ou {xxxx} [xxxxx] <xxxxxx>. De toute les façons, c'est le problème de PHP, pas celui du moteur regex qui reçoit le motif d'un côté et les option de l'autre après que PHP ait parsé ses délimiteurs.
Les motifs suivants sont donc tout à fait légitimes à défaut d'être lisibles:
// liste (non exhaustive) de délimiteurs possibles
preg_match('&rocks&i', 'PHP rocks!')
preg_match('érockséi', 'PHP rocks!')
preg_match('§rocks§i', 'PHP rocks!')
preg_match('^rocks^i', 'PHP rocks!')
preg_match('èrocksèi', 'PHP rocks!')
preg_match('!rocks!i', 'PHP rocks!')
preg_match('*rocks*i', 'PHP rocks!')
preg_match('$rocks$i', 'PHP rocks!')
preg_match('+rocks+i', 'PHP rocks!')
preg_match('~rocks~i', 'PHP rocks!')
preg_match('=rocks=i', 'PHP rocks!')
preg_match('.rocks.i', 'PHP rocks!')
preg_match(';rocks;i', 'PHP rocks!')
preg_match('/rocks/i', 'PHP rocks!')
preg_match('?rocks?i', 'PHP rocks!')
preg_match('çrocksçi', 'PHP rocks!')
preg_match('-rocks-i', 'PHP rocks!')
preg_match('@rocks@i', 'PHP rocks!')
preg_match('°rocks°i', 'PHP rocks!')
preg_match('_rocks_i', 'PHP rocks!')
preg_match('ùrocksùi', 'PHP rocks!')
preg_match('µrocksµi', 'PHP rocks!')
preg_match('£rocks£i', 'PHP rocks!')
preg_match('|rocks|i', 'PHP rocks!')
preg_match('~rocks~i', 'PHP rocks!')
// bizarreries PHP
preg_match('(rocks)i', 'PHP rocks!')
preg_match('[rocks]i', 'PHP rocks!')
preg_match('{rocks}i', 'PHP rocks!')
preg_match('<rocks>i', 'PHP rocks!')
D'autres langages sont plus restrictifs sur l'emploi des délimiteurs: awk ,'accepte que le traditionnel /xxxx/, par contre sed est plus souple.
Code : Tout sélectionner
# awk
echo 'PHP rocks!' | awk '/rocks/ {print}'
# sed
echo 'PHP rocks!' | sed 's/rocks/est génial/g'
echo 'PHP rocks!' | sed 's%rocks%est génial%g'
echo 'PHP rocks!' | sed 's{rocks{est génial{g'
echo 'PHP rocks!' | sed 's%rocks%est génial%g'
Voilà, s'il y a ici un spécialiste PERL, qu'il parle maintenant ou se taise à jamais!

[quote="Arcanis"]Par contre, il y a juste un petit truc que je n'ai pas compris: pourquoi ne pas échapper les caractères < et >? D'après l'explication de preg_quote, ils sont utilisés dans les regex, donc je pensais qu'il fallait les échapper.[/quote]
Allez, comme je n'interviens plus très souvent sur ce forum, je me fends d'une longue explication. :wink:
< et > ne font pas partie des méta-caractères des pcre. Mais, effectivement, preg_quote les échappe pour une raison que j'ignore. Voici la liste officielle des méta-caractères:
[quote] \ general escape character with several uses
^ assert start of string (or line, in multiline mode)
$ assert end of string (or line, in multiline mode)
. match any character except newline (by default)
[ start character class definition
| start of alternative branch
( start subpattern
) end subpattern
? extends the meaning of (
also 0 or 1 quantifier
also quantifier minimizer
* 0 or more quantifier
+ 1 or more quantifier
also "possessive quantifier"
{ start min/max quantifier
Part of a pattern that is in square brackets is called a "character
class". In a character class the only metacharacters are:
\ general escape character
^ negate the class, but only if the first character
- indicates character range
[ POSIX character class (only if followed by POSIX
syntax)
] terminates the character class
http://www.pcre.org/pcre.txt
[/quote]
Quant aux délimiteurs, on peut y mettre tout caractère non alpha-numérique. Php y rajoute quelques bizarreries comme (xxxx) ou {xxxx} [xxxxx] <xxxxxx>. De toute les façons, c'est le problème de PHP, pas celui du moteur regex qui reçoit le motif d'un côté et les option de l'autre après que PHP ait parsé ses délimiteurs.
Les motifs suivants sont donc tout à fait légitimes à défaut d'être lisibles:
[php]// liste (non exhaustive) de délimiteurs possibles
preg_match('&rocks&i', 'PHP rocks!')
preg_match('érockséi', 'PHP rocks!')
preg_match('§rocks§i', 'PHP rocks!')
preg_match('^rocks^i', 'PHP rocks!')
preg_match('èrocksèi', 'PHP rocks!')
preg_match('!rocks!i', 'PHP rocks!')
preg_match('*rocks*i', 'PHP rocks!')
preg_match('$rocks$i', 'PHP rocks!')
preg_match('+rocks+i', 'PHP rocks!')
preg_match('~rocks~i', 'PHP rocks!')
preg_match('=rocks=i', 'PHP rocks!')
preg_match('.rocks.i', 'PHP rocks!')
preg_match(';rocks;i', 'PHP rocks!')
preg_match('/rocks/i', 'PHP rocks!')
preg_match('?rocks?i', 'PHP rocks!')
preg_match('çrocksçi', 'PHP rocks!')
preg_match('-rocks-i', 'PHP rocks!')
preg_match('@rocks@i', 'PHP rocks!')
preg_match('°rocks°i', 'PHP rocks!')
preg_match('_rocks_i', 'PHP rocks!')
preg_match('ùrocksùi', 'PHP rocks!')
preg_match('µrocksµi', 'PHP rocks!')
preg_match('£rocks£i', 'PHP rocks!')
preg_match('|rocks|i', 'PHP rocks!')
preg_match('~rocks~i', 'PHP rocks!')
// bizarreries PHP
preg_match('(rocks)i', 'PHP rocks!')
preg_match('[rocks]i', 'PHP rocks!')
preg_match('{rocks}i', 'PHP rocks!')
preg_match('<rocks>i', 'PHP rocks!')
[/php]
D'autres langages sont plus restrictifs sur l'emploi des délimiteurs: awk ,'accepte que le traditionnel /xxxx/, par contre sed est plus souple.
[code]# awk
echo 'PHP rocks!' | awk '/rocks/ {print}'
# sed
echo 'PHP rocks!' | sed 's/rocks/est génial/g'
echo 'PHP rocks!' | sed 's%rocks%est génial%g'
echo 'PHP rocks!' | sed 's{rocks{est génial{g'
echo 'PHP rocks!' | sed 's%rocks%est génial%g'
[/code]
Voilà, s'il y a ici un spécialiste PERL, qu'il parle maintenant ou se taise à jamais! :wink: