IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Erreur de syntaxe, variable dans une string [PHP 5.5]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    477
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 477
    Points : 198
    Points
    198
    Par défaut Erreur de syntaxe, variable dans une string
    Bonjour et merci d'avance pour votre aide.
    J'aime inclure un variable dans un chaine regex, pour mon model.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    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

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    La partie que tu nous montres est correcte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $validate = array('rule' => array('custom', "/^[a-z{$specialChars}](?:[ -]{1}[a-z]|['a-z{$specialChars}]+)+$/i"));
    Le problème est dans ce que tu ne montres pas.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    477
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 477
    Points : 198
    Points
    198
    Par défaut
    Merci de ta réponse.
    Pour info je suis sous CakePHP 2.x

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php
    App::uses('AppModel', 'Model');
     
    class Store extends AppModel {
     
        public $specialChars = "àáâäæçèéêëìíîïñòóôœùúûüýÿß";
     
        public $validate = array(
            'storename' => array(
                'setChar' => array(
                    'rule' => array('custom', "/^[a-z{$specialChars}](?:[ -]{1}[a-z]|['a-z{$specialChars}]+)+$/i"),
                    'message' => 'Caractére invalide'
                ),
                'length' => array(
                    'rule' => array('between', 5, 15),
                    'message' => 'Ce nom doit comporté entre 5 et 15 caractéres'
                ))
        );
     
    }

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Excuse moi j'ai répondu un peu vite : tu ne peux pas avoir une expression évaluée pour "public", seulement une expression littérale ou une constante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php
     
    $specialChars = "àáâäæçèéêëìíîïñòóôœùúûüýÿß";
    define('EXPRESSION', "/^[a-z$specialChars](?:[ -]{1}[a-z]|['a-z$specialChars]+)+$/i");
     
    class Store extends AppModel {
     
        public $validate = array(
            'storename' => array(
                'setChar' => array(
                    'rule' => array('custom', EXPRESSION),
                    'message' => 'Caractére invalide'
                ),
                'length' => array(
                    'rule' => array('between', 5, 15),
                    'message' => 'Ce nom doit comporté entre 5 et 15 caractéres'
                ))
        );
     
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Je ne vois pas non plus d'où provient ton erreur. Peut-être que tu as oublié de refermer quelque chose, bien en amont de la ligne annoncée en erreur, mais que l'interpréteur PHP ne s'en rend compte qu'au niveau de cette ligne?

    Par contre au sujet de ta pattern:
    • le quantificateur {1} ne sert à rien (en toutes circonstances), a matche a, pas la peine d'écrire a{1}.
    • comme tu dois dealer avec des chaînes multibytes (encodées en UTF-8) tu dois prévenir le moteur de regex avec le modificateur u (sinon il va croire que chaque octet correspond à un seul caractère et ne sera pas en mesure de reconnaître qu'un groupe d'octets représente une seule lettre, et ce aussi bien pour la chaîne qu'il traite que pour la pattern qu'il doit compiler).
    • Tu peux éventuellement utiliser \p{Latin} en lieu et place de [a-z{$specialChars}] (\p{Latin} contient toutes les lettres latines en majuscule ou en minuscule, avec ou sans accents.) C'est plus permissif que ta sélection de caractères mais c'est peut-être ce que tu cherches à faire?
    • Attention aux constructions de ce type (a+|b)+subpattern (quantificateurs imbriqués suivis d'une contrainte quelconque) qui peuvent causer un catastrophic backtracking (regarde sur ce lien le nombre d'étapes nécessaires avant l'échec de la pattern, et ajoute une lettre avant le 1 pour voir l'évolution). Pour l'éviter, tu peux ajouter un quantificateur possessif à ton groupe (a+|b)++subpattern
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    477
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 477
    Points : 198
    Points
    198
    Par défaut
    Merci Sabotage pour ta solution.

    Tu ne peux pas avoir une expression évaluée pour "public", seulement une expression littérale ou une constante.
    J'ignorais cela, que puis-je taper sur google ou ici pour avoir plus de détails à ce sujet ?

    Merci à vous tous pour votre aide.

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    http://php.net/manual/fr/language.oop5.static.php
    Comme n'importe quelle autre variable PHP statique, les propriétés statiques ne peuvent être initialisées qu'en utilisant un littéral ou une constante ; les expressions ne sont pas permises. Ainsi, vous pouvez initialiser une propriété statique avec un entier ou un tableau, mais pas avec une autre variable, ni avec la valeur de retour d'une fonction, ni avec un objet.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    477
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 477
    Points : 198
    Points
    198
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Je ne vois pas non plus d'où provient ton erreur. Peut-être que tu as oublié de refermer quelque chose, bien en amont de la ligne annoncée en erreur, mais que l'interpréteur PHP ne s'en rend compte qu'au niveau de cette ligne?

    Par contre au sujet de ta pattern:
    • le quantificateur {1} ne sert à rien (en toutes circonstances), a matche a, pas la peine d'écrire a{1}.
    • comme tu dois dealer avec des chaînes multibytes (encodées en UTF-8) tu dois prévenir le moteur de regex avec le modificateur u (sinon il va croire que chaque octet correspond à un seul caractère et ne sera pas en mesure de reconnaître qu'un groupe d'octets représente une seule lettre, et ce aussi bien pour la chaîne qu'il traite que pour la pattern qu'il doit compiler).
    • Tu peux éventuellement utiliser \p{Latin} en lieu et place de [a-z{$specialChars}] (\p{Latin} contient toutes les lettres latines en majuscule ou en minuscule, avec ou sans accents.) C'est plus permissif que ta sélection de caractères mais c'est peut-être ce que tu cherches à faire?
    • Attention aux constructions de ce type (a+|b)+subpattern (quantificateurs imbriqués suivis d'une contrainte quelconque) qui peuvent causer un catastrophic backtracking (regarde sur ce lien le nombre d'étapes nécessaires avant l'échec de la pattern, et ajoute une lettre avant le 1 pour voir l'évolution). Pour l'éviter, tu peux ajouter un quantificateur possessif à ton groupe (a+|b)++subpattern
    • Le quantificateur {1} évite de doublé les trait d'union et les espaces.
    • \p{latin} je ne connaissais pas. Il est vrai que ça serait plus pratique que d'énuméré chaque caractéres spéciaux.
      Et pourtant c'est la solution préconisé sur plusieurs post dans le forum.


    Merci à toi,

  9. #9
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Encore une fois le {1} n'évite rien du tout, il ne sert à rien. Écrire [ -]{1} ou a{1} ou (?:groupe_avec_des_trucs){1} c'est pareil que d'écrire [ -], a ou (?:groupe_avec_des_trucs). Le {1} est juste redondant et n'a aucun effet. Les éléments ne seront pas plus ou moins répétés en l'ajoutant. Fais l'essai avec et sans, tu verras bien.

    Et pourtant c'est la solution préconisée sur plusieurs posts dans le forum.
    Possible, tout le monde ne connaît pas les classes de caractères unicode comme \p{Latin}, peut-être parce que ce n'est pas disponible dans tous les langages ou parce que les gens s'imaginent que la liste des caractères latins a été établie lors du traité de Rome.

    Quoi qu'il en soit, il ne faut rien prendre pour argent comptant et tester et se renseigner. Derrière une pattern aux allures inoffensives puis se cacher un piège diabolique!

    Un petit test pour illustrer:https://eval.in/478113
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    477
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 477
    Points : 198
    Points
    198
    Par défaut
    ...ou parce que les gens s'imaginent que la liste des caractères latins a été établie lors du traité de Rome.
    Quoi qu'il en soit, il ne faut rien prendre pour argent comptant et tester et se renseigner.
    Bien évidemment, j'avais aussi consulter plusieurs site de référence sur Regex (FR/EN), mais pas un mot sur classes de caractères jusqu’à ce que tu m'en parle.

    En tout cas, merci CosmoKnacki pour cet échange et tes enseignements.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Nom d'une variable dans une string
    Par Ing_Ben dans le forum C#
    Réponses: 1
    Dernier message: 26/10/2011, 16h50
  2. [MySQL] probleme de syntaxe variable dans une requete sql
    Par nico le noob dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 03/09/2010, 13h20
  3. Réponses: 3
    Dernier message: 07/05/2009, 15h39
  4. [MySQL] Une variable dans une requette sql erreur syntaxe
    Par Tiny Buster dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 13/07/2008, 22h21
  5. Concaténer une variable dans une String
    Par une_tite_question dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 25/05/2008, 06h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo