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 à des délimiteurs, il ne fait pas référence aux délimiteurs que vous voyez dans votre code (qui sont des guillemets) mais au suivant caractères à l'intérieur de la chaîne. (En fait, je n'ai jamais vu cela déclaré nulle part dans aucune documentation: vous devez le voir dans des exemples.) Donc, 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, puis cherche dans la chaîne un 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. Donc, si vous écrivez 'something'
, PHP prendras
comme délimiteur prévu et se plaindra que vous n'êtes pas autorisé à utiliser des caractères alphanumériques comme délimiteur.
Donc, 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 en dehors des délimiteurs de regex:
'/something/i'
Si vous voulez utiliser autre chose que /
votre délimiteur, vous pouvez, par exemple si vous correspondez à une URL et que vous ne voulez pas avoir à échapper toutes les barres obliques:
'~something~'
preg_match()
tant que variables, assurez-vous de ne pas mélanger accidentellement l'ordre des variables dans l'appel de fonction, car cela entraînera presque certainement le même résultat erreur apparaissant.