2 votes

Regex en PHP retournant preg_match() : La compilation a échoué : PCRE ne supporte pas \L , \l , \N {nom}, \U ou \u

J'essaie de vérifier la validité d'une entrée utilisateur en PHP en utilisant une expression rationnelle, mais je n'arrive pas à comprendre ce qui ne va pas avec mon expression rationnelle.

Voici mon if déclaration :

if(is_numeric($_SESSION['l-teacher'])&&preg_match('/^[A-Za-z0-9\u0590-\u05ff\*\-\.\, ]+$/',$_POST['content'])&&preg_match('/^[\u0590-\u05fe ]+$/',$_POST['name'])&&is_numeric($_POST['stars'])&&$_POST['stars']>0&&$_POST['stars']<6){

\ si vrai }

J'obtiens l'erreur suivante :

Attention : preg_match() : La compilation a échoué : PCRE ne prend pas en charge \L , \l , \N {nom}, \U ou \u à l'offset 12

5voto

IMSoP Points 16089

"PCRE est l'abréviation de "Perl-Compatible Regular Expressions", mais cela ne signifie pas que toutes les fonctionnalités disponibles dans les regex de Perl5 sont disponibles dans PCRE. Le manuel PHP a une page sur PCRE : Différences avec Perl qui comprend une déclaration similaire à celle du message d'erreur :

Les séquences d'échappement Perl suivantes ne sont pas prises en charge : \l , \u , \L , \U. En fait, ils sont mis en œuvre par le traitement général des chaînes de caractères de Perl et ne font pas partie de son moteur de recherche de motifs.

PHP (depuis 7.0) dispose de le soutien à \u échappements dans une chaîne de caractères , si elle est entre guillemets donc "\u{0590}" représenterait ce caractère mais pourrait ne pas avoir l'effet désiré à l'intérieur de la regex En effet, vous devez indiquer à la classe de caractères que vous souhaitez une plage de points de code Unicode, et non un ensemble de valeurs 8 bits possibles.

Ce que vous voulez en fait dans ce cas est la notation PCRE pour les points de code Unicode qui est décrit sous Séquences d'évasion :

En mode UTF-8, " \x {...}" est autorisé, où le contenu des accolades est une chaîne de chiffres hexadécimaux. Elle est interprétée comme un caractère UTF-8 dont le numéro de code est le nombre hexadécimal donné.

La mention du "mode UTF-8" fait référence à le site u modificateur de motif :

Ce modificateur active des fonctionnalités supplémentaires de PCRE qui sont incompatibles avec Perl. Les chaînes de motifs et de sujets sont traitées en UTF-8. Un sujet invalide fera en sorte que la fonction preg_* ne correspondra à rien ; un motif invalide déclenchera une erreur de niveau E_WARNING.

Donc je crois que votre schéma de :

'/^[\u0590-\u05fe ]+$/'

devrait être changé en :

'/^[\x{0590}-\x{05fe} ]+$/u'

Notez que, comme le manuel de l u implique, la chaîne sujet doit être encodé en UTF-8 pour que cela fonctionne ; il n'y a pas de support pour UTF-16 ou tout autre encodage Unicode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X