Délimiteurs

Lors de l'utilisation des fonctions PCRE, il est nécessaire que le motif soit encadré par des délimiteurs. Un délimiteur peut être n'importe quel caractère non alpha-numérique autre qu'un backslash ou qu'un espace. Les caractères d'espacement blanc avant un délimiteur valide sont silencieusement ignoré.

Les délimiteurs les plus courants sont les slashes (/), dièses (#) et les tildes (~). Les exemples suivants ont tous des motifs encadrés avec des délimiteurs valides.

/foo bar/
#^[^0-9]$#
+php+
%[a-zA-Z0-9_-]%

Il est également possible d'utiliser les délimiteurs utilisant les crochets où les crochets ouvrants et fermants sont respectivement les délimiteurs de début et de fin. (), {}, [] and <> sont tous des styles de crochets valides.

(this [is] a (pattern))
{this [is] a (pattern)}
[this [is] a (pattern)]
<this [is] a (pattern)>
Les délimiteurs utilisant les crochets n'ont pas besoin d'être échappés lorsqu'ils sont utilisés comme caractères méta dans un masque, mais, comme tout autre opérateur, ils doivent être échappés s'ils sont utilisés comme caractères littéraux.

Si le délimiteur doit être décrit dans le motif, il doit être échappé avec un backslash. Si le délimiteur apparait souvent dans le motif, choisir un autre délimiteur est une bonne idée pour en augmenter la lisibilité.

/http:\/\//
#http://#
La fonction preg_quote() peut être utilisée pour échapper une chaine et l'utiliser dans un motif. Son second paramètre optionnel sert à spécifier le délimiteur qui doit être échappé.

Vous pouvez aussi utiliser des modificateurs de motif après le délimiteur final. L'exemple suivant montre une correspondance insensible à la casse.

#[a-z]#i

add a note add a note

User Contributed Notes 3 notes

up
39
Pedro Gimeno
9 years ago
Note that bracket style opening and closing delimiters aren't a 100% problem-free solution, as they need to be escaped when they aren't in matching pairs within the expression. That mismatch can happen when they appear inside character classes [...], as most meta-characters lose their special meaning. Consider these examples:

<?php
  preg_match
('{[{]}', ''); // Warning: preg_match(): No ending matching delimiter '}'
 
preg_match('{[}]}', ''); // Warning: preg_match(): Unknown modifier ']'
 
preg_match('{[}{]}', ''); // Warning: preg_match(): Unknown modifier ']'
?>

Escaping them solves it:

<?php
  preg_match
('{[\{]}', ''); // OK
 
preg_match('{[}]}', ''); // OK
 
preg_match('{[\}\{]}', ''); // OK
?>
up
5
Revo
5 years ago
Note that angle brackets `<>` shouldn't be used as delimiters whenever you will have to invoke advanced clusters like atomic groups or lookbehinds because their including angle bracket doesn't come in pair and escaping doesn't help either.
up
10
Munin
9 years ago
preg_match('{[}]}', ''); // Warning: preg_match(): Unknown modifier ']'

preg_match('{[\}]}', ''); // OK
To Top