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


PhiSyX
Réponse acceptée

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)
        ...
    );

Ce serait déjà plus juste avec :

$this->specialChars

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.

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'

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,

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.

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'
            ))
    );

}

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.

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 ?

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