Erreur de syntaxe, variable dans une string

Par Majid Cameleon, il y a 10 ans


Bonjour et merci d'avance pour votre aide.
J'aime inclure un variable dans un chaine regex, pour mon model.

class Store extends AppModel { public $specialChars = "àáâäæçèéêëìíîïñòóôœùúûüýÿß"; public $validate = array( ... 'rule' => array('custom', "/^[a-z{$specialChars}](?:[ -]{1}[a-z]|['a-z{$specialChars}]+)+$/i")

Et la dérniére ligne de code pose probléme, je ne comprend pas pourquoi: syntax error, unexpected '"', expecting ')'

Merci à vous.

10 réponses

Ferias Quarante, il y a 10 ans

Ce serait déjà plus juste avec :

$this->specialChars
Majid Cameleon, il y a 10 ans

Merci pour ton bout de code.
Mais c'est pour déclarer ma variable ou a placer dans mon regex. Dans les deux cas, cela me génére une erreur.

Lartak, il y a 10 ans

Bonjour.
Tu as une apostrophe qui ne sert à rien dans ta regex, remplaces :

"/^[a-z{$specialChars}](?:[ -]{1}[a-z]|['a-z{$specialChars}]+)+$/i"

Par :

'/^[a-z{$this->specialChars}](?:[ -]{1}[a-z]|[a-z{$this->specialChars}]+)+$/i'
Majid Cameleon, il y a 10 ans

Salut Lartak, comment va ? ;-)

Pour commencer, l'apostrophe n'est pas de trop. Elle est nécessaire pour valider les mots comme l'école, O'Donnell.
Et je suis obliger de placer ma string entre guillement ", si non elle parse pas la variable.

"/^[a-z{$this->specialChars}](?:[ -]{1}[a-z]|['a-z{$this->specialChars}]+)+$/i"

Merci à vous,

freezlike, il y a 10 ans

Bonjour,

si elle nécessaire alors tu fais un escape dessus " \' " pour qu'elle ne soit pas prise en compte par la classe qui génère l'erreur de parsing

Cdt.

Majid Cameleon, il y a 10 ans

Il n'est pas possible d'avoir une expression évaluée en "public", seulement une expression littérale ou une constante.
La solution qui fonctionne est donc la suivante.

<?php $specialChars = "àáâäæçèéêëìíîïñòóôœùúûüýÿß"; define('REGEX', "/^[a-z$specialChars](?:[ -]{1}[a-z]|['a-z$specialChars]+)+$/i"); class Store extends AppModel { public $validate = array( 'storename' => array( 'setChar' => array( 'rule' => array('custom', REGEX), 'message' => 'Caractére invalide' ), 'length' => array( 'rule' => array('between', 5, 15), 'message' => 'Ce nom doit comporté entre 5 et 15 caractéres' )) ); }
Lartak, il y a 10 ans

Il n'est pas possible d'avoir une expression évaluée en "public", seulement une expression littérale ou une constante.

Ce n'est pas de cette manière qu'il faut créer des règles de validations personnalisées sur CakePHP, mais comme ceci : Ajouter vos propres méthodes de validation.
Sinon, je vais bien, merci.

PhiSyX, il y a 10 ans

Yop, tu peux effectivement utiliser les constantes mais comme ceci... ^^

class Store extends AppModel { const STORE_NAME_SPECIAL_CHARS = "àáâäæçèéêëìíîïñòóôœùúûüýÿß"; const STORE_NAME_REGEX = "/^[a-z" . self::STORE_NAME_SPECIAL_CHARS . "](?:[ -]{1}[a-z]|['a-z" . self::STORE_NAME_SPECIAL_CHARS . "]+)+$/i"; public $validate = array( ... 'rule' => array('custom', self::STORE_NAME_REGEX) ... );
Majid Cameleon, il y a 10 ans

Merci à vous, mais permettez moi de sortir un peu du contexte.
Je viens de découvrir ceci, les propriétés des caractères Unicode

Plus puissant que mon ancien regex.
^(?![\s'-])(?:[\s'-]{0,1}[\p{L}])+$
Celle-ci génére pas d'erreur, mais la validation ne passe pas avec les caratéres spéciaux.

PS: Si vous préférez je publie un nouveau post pour cette nouvelle question ?

Majid Cameleon, il y a 10 ans

Mon nouveau regex est fonctionnel, il suffisait juste que le pattern ai en option "\u" pour les caractéres unicode .