Maison > développement back-end > tutoriel php > Pourquoi mon PHP Regex produit-il « preg_match() : échec de la compilation : plage non valide dans la classe de caractères » après la mise à niveau vers PHP 7.3 ?

Pourquoi mon PHP Regex produit-il « preg_match() : échec de la compilation : plage non valide dans la classe de caractères » après la mise à niveau vers PHP 7.3 ?

Susan Sarandon
Libérer: 2024-12-06 01:37:13
original
246 Les gens l'ont consulté

Why Does My PHP Regex Produce

Plage non valide dans la classe de caractères : comprendre le problème après la mise à niveau de PHP

Le message d'erreur "preg_match() : Échec de la compilation : plage non valide dans la classe de caractères" indique un problème avec l'expression régulière utilisée dans le code fourni. Ce problème peut survenir après une mise à niveau de PHP, en particulier lors de la migration de versions antérieures vers PHP 7.3 ou plus récentes en raison de modifications apportées à la bibliothèque PCRE2.

Le passage à PCRE2 dans PHP 7.3

Avec PHP 7.3 , le moteur PHP PCRE est passé à PCRE2, provoquant plusieurs modifications rétrocompatibles :

  • Le modificateur "S" est inefficace, car les modèles sont automatiquement étudiés.
  • Le modificateur "X" se comporte par défaut dans PCRE2, sans impact significatif.
  • Unicode 10 est implémenté dans PCRE2, introduisant potentiellement des changements de comportement avec des modèles.

Traits d'union dans les classes de caractères : pré- et post-PHP 7.3

Avant PHP 7.3, les traits d'union pouvaient être utilisés dans les classes de caractères dans n'importe quelle position s'ils étaient échappés ou placés là où ils ne pouvaient pas indiquer de plage. Cependant, dans PHP 7.3 et versions ultérieures, PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL est défini sur false par défaut.

Par conséquent, pour inclure un trait d'union dans une classe de caractères :

  • Utilisez-le au début ou à la fin de le classe.

Exemple :

Dans le code fourni, la ligne problématique est :

if(!preg_match("/^[a-z0-9]([0-9a-z_-\s])+$/i", $subuser)){
Copier après la connexion

Le problème vient du trait d'union (-) dans le caractère classe [0-9a-z_-s]. Pour résoudre ce problème, placez le trait d'union à la fin ou au début :

if(!preg_match("/^[a-z0-9]([0-9a-z\_-\s0-9a-z\_-\s])+$/i", $subuser)){
Copier après la connexion

Référence supplémentaire :

"PHP 7.3 : PCRE2 a supprimé PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL" fournit des informations supplémentaires :

PCRE2 est plus strict dans les validations de modèles, donc après la mise à niveau, certains de vos modèles existants pourraient ne compile plus.

Par conséquent, un examen minutieux et une modification des modèles existants peuvent être nécessaires pour garantir la compatibilité avec PCRE2 dans PHP 7.3 et versions ultérieures.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal