Lors d’une mise à jour PHP, un vieux site peut soudain afficher une erreur qui sent bon la regex fatiguée :
preg_match(): Compilation failed: invalid range in character class at offset 20Code language: JavaScript (javascript)
Le message paraît obscur. Pourtant, la cause est souvent très simple : une expression régulière contient un tiret - mal placé dans une classe de caractères.
Depuis PHP 7.3, PHP utilise PCRE2 pour les expressions régulières. Cette migration a rendu certains patterns plus stricts. Résultat : une regex qui passait silencieusement sur une ancienne version PHP peut échouer après une montée de version.
Pourquoi cette erreur apparaît-elle ?
Dans une expression régulière, les crochets définissent une classe de caractères.
Par exemple :
/[abc]/
Cette regex accepte un caractère parmi a, b ou c.
Autre exemple :
/[a-z]/
Ici, le tiret indique une plage : toutes les lettres de a à z.
Le problème apparaît quand PHP rencontre un tiret à un endroit ambigu. Par exemple :
/[\w-.]+/
Dans cette classe, le moteur PCRE2 peut interpréter le tiret comme un opérateur de plage entre \w et .. Cette plage n’a pas de sens. PHP refuse donc de compiler l’expression régulière.
C’est pour cela que le message parle de Compilation failed. Le problème ne vient pas de la chaîne testée. Il vient du pattern lui-même.