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 :

No ending delimiter '^' found [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 183
    Points : 121
    Points
    121
    Par défaut No ending delimiter '^' found
    Bonjour,

    Mon expression rationnelle semble marcher, mais je n'en suis pas sur car j'ai n warning.

    La fonction suivante accepte uniquement [[:alpha:]] (en fonction du pays grace à setlocale) :
    - retourne VRAI pour [jean] [élie] [jean-élie] [jean élie] [long-pont-sur-l'arrivée]
    - retourne FAUX pour [les 2 rives] [mystere & compagnie] [1234]

    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
    21
    22
    23
    24
    25
    26
    27
     
    function is_alpha_only($arg_str)
    {
    	$str = trim($arg_str); //suppression espace avant ou après
    	if (strlen($str)<1) return false; // pas de chaine vide
    	setlocale(LC_TIME, get_lang_locale());// prise en charge des caractères en fonction du pays
    	$pattern ='^[[:alpha:]]'; // chercher tout caractère qui n'est pas alpha 
    	if(preg_match($pattern, $str)==1) return false;// caractère non alpha trouvé
     	return true;
    }
     
    //--- test de la fonction
     
    $arr["jean"]=true;
    $arr["élie"]=true;
    $arr["jean-élie"]=true;
    $arr["jean élie"]=true;
    $arr["long-pont-sur-l'arrivée"]=true;
    $arr["les 2 rives"]=false;
    $arr["mystere & compagnie"]=false;
    $arr["1234"]=false;
    foreach ($arr as $key=>$value)
    {
      if($value!=is_alpha_only($key)) echo "resultat erroné";
      else echo "resultat correct";
      echo " pour [".$key."]\n</br>";
    }
    J'ai le résultat suivant :

    resultat correct pour [jean]
    resultat correct pour [élie]
    resultat correct pour [jean-élie]
    resultat correct pour [jean élie]
    resultat correct pour [long-pont-sur-l'arrivée]
    resultat erroné pour [les 2 rives]
    resultat erroné pour [mystere & compagnie]
    resultat erroné pour [1234]

    mais avec un warning pour chaque ligne:

    PHP Warning: preg_match() [<a href='function.preg-match'>function.preg-match</a>]: No ending delimiter '^' found in ...

    Je dois avoir un pb de syntaxe que je ne parviens pas a trouver.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Le motif est faux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '/^[[:alpha:]]+$/';
    Les fonctions de l'extension PCRE attendent un délimiteur (ici /) pour marquer les débuts et fin de l'expression car à la fin de celles-ci on peut y spécifier des options (comme i : insensibilité à la casse par exemple).

    Enfin, pour n'autoriser que les chaînes composées des caractères [a-zA-Z] (en tenant compte de la locale), il faut indiquer le nombre d'occurrences minimal/maximal (ici + pour au moins 1) et ajouter l'ancre de fin de chaîne ($). Parce que votre motif initial aurait correspondance sur toute chaîne commençant par un tel caractère, ce qui est bien différent.

    Par ailleurs, pour autoriser l'espace et le tiret, il faudra les ajouter à votre classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '/^[[:alpha:] -]+$/';
    Voir quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '/^[[:alpha:]][[:alpha:] -]*$/';

  3. #3
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    Merci julp pour votre aide.

    Pour le warning, y avait bien un pb de délimiteur.
    Par contre je ne comprend pas pourquoi il faut une ancre de fin ou bien préciser le nombre d'occurence.
    Notez que je cherche la première occurence d'un seul caractère :

    Tout caractère qui ne soit [PAS ["alpha" ET "-" ET espace]] : peu importe qu'il soit a la fin ou pas.

    J'ai essayé vos propositions :

    resultat erroné pour [jean]
    resultat erroné pour [élie]
    resultat correct pour [jean-élie]
    resultat correct pour [jean élie]
    resultat correct pour [long-pont-sur-l'arrivée]
    resultat erroné pour [les 2 rives]
    resultat erroné pour [mystere & compagnie]
    resultat erroné pour [1234]


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '/^[[:alpha:] -]+$/'   OU    '/^[[:alpha:]][[:alpha:] -]*$/'
    resultat erroné pour [jean]
    resultat erroné pour [élie]
    resultat erroné pour [jean-élie]
    resultat erroné pour [jean élie]
    resultat correct pour [long-pont-sur-l'arrivée]
    resultat erroné pour [les 2 rives]
    resultat erroné pour [mystere & compagnie]
    resultat erroné pour [1234]

    Puis j'ai essayé
    resultat correct pour [jean]
    resultat correct pour [élie]
    resultat correct pour [jean-élie]
    resultat correct pour [jean élie]
    resultat correct pour [long-pont-sur-l'arrivée]
    resultat erroné pour [les 2 rives]
    resultat erroné pour [mystere & compagnie]
    resultat erroné pour [1234]

    ... ça m'a l'air bon (et sans warning ).

    Mais comme je me méfie comme de la peste des REGEX (que je trouve peu lisible, je n'ai jamais réussi une seule expression rationnelle du premier coup ), je souhaite avoir un deuxième avis.

    Julp vous pouvez me confirmer ?

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Ok, je n'avais pas compris votre motif et but mais ça revient en fait strictement au même, j'ai simplement écrit le contraire (il suffit de nier preg_match). N'autoriser une chaîne qu'à respecter un motif (exemple : une chaîne ne pouvant comporter que des chiffres ^\d+$) et chercher un caractère autre/interdit dans cette chaîne (soit [^\d] pour le même exemple) c'est la même chose (pour de la validation, donc sans captures).

    Bref, pour votre motif :
    Et il y a probablement l'apostrophe à y ajouter.

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

Discussions similaires

  1. [function.preg-match]: No ending delimiter
    Par fwebconcept dans le forum Langage
    Réponses: 2
    Dernier message: 01/08/2013, 01h24
  2. Réponses: 4
    Dernier message: 02/12/2010, 14h38
  3. Front End graphique pour GDB sous windows
    Par KORTA dans le forum GDB
    Réponses: 8
    Dernier message: 20/08/2003, 09h52
  4. TXMLModule.create - name = resource not found
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 04/03/2003, 10h54
  5. Component not found
    Par Pm dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 14h40

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