La solution (que les autres réponses ne mentionnent pas - du moins au moment où j'ai écrit ceci) est que lorsque PHP fait référence aux délimiteurs, il ne fait pas référence aux délimiteurs que vous voyez dans votre code (qui sont des guillemets) mais aux caractères suivants à l'intérieur de la chaîne de caractères. (En fait, je n'ai jamais vu cela dans aucune documentation : il faut le voir dans les exemples). Ainsi, au lieu d'avoir une syntaxe d'expression régulière comme celle à laquelle vous êtes habitué dans de nombreux autres langages :
/something/
PHP utilise des chaînes de caractères, puis recherche dans la chaîne de caractères les éléments suivants autre délimiteur :
'/something/'
Le délimiteur auquel PHP fait référence est la paire de caractères /
au lieu de la paire de caractères '
caractères. Ainsi, si vous écrivez 'something'
PHP prendra s
comme délimiteur prévu et se plaindre qu'il n'est pas permis d'utiliser des caractères alphanumériques comme délimiteurs.
Ainsi, si vous voulez passer (par exemple) un i
pour montrer que vous voulez une correspondance insensible à la casse, vous le passez à l'intérieur de la chaîne mais à l'extérieur des délimiteurs de la regex :
'/something/i'
Si vous souhaitez utiliser autre chose que /
comme délimiteur, vous pouvez le faire, par exemple si vous faites correspondre une URL et que vous ne voulez pas avoir à échapper toutes les barres obliques :
'~something~'
3 votes
Une remarque qui pourrait être utile à d'autres, si vous passez tous vos arguments à
preg_match()
en tant que variables, veillez à ne pas mélanger accidentellement l'ordre des variables dans l'appel de la fonction, car cela entraînera très certainement l'apparition de cette même erreur.1 votes
Vous avez besoin d'un délimiteur dans votre chaîne d'expressions rationnelles
2 votes
Utilisation
$pattern = "/My name is '(.*)' and im fine/";