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 :

Motif simple mais introuvable pour PCRE


Sujet :

Langage PHP

  1. #1
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut Motif simple mais introuvable pour PCRE
    Bonjour,

    j'essaye tant bien que mal à trouver le motif permettant l'autorisation et l'interdiction des chaines suivantes :
    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
    $aChainesOK = array();
    $aChainesOK[] = "a";
    $aChainesOK[] = "at";
    $aChainesOK[] = "Ta";
    $aChainesOK[] = "TT";
    $aChainesOK[] = "TaT";
    $aChainesOK[] = "at a";
    $aChainesOK[] = "aT a";
    $aChainesOK[] = "aT T";
    $aChainesOK[] = "aa TT";
    $aChainesOK[] = "aa TT a";
    $aChainesOK[] = "a-a";
    $aChainesOK[] = "T-a";
    $aChainesOK[] = "T-T";
    $aChainesOK[] = "é";
    $aChainesOK[] = "aé";
    $aChainesOK[] = "a-é";
    $aChainesOK[] = "a-éT";
    $aChainesOK[] = "a-é Ta";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $aChainesKO = array();
    $aChainesKO[] = "a-";
    $aChainesKO[] = "@";
    $aChainesKO[] = "a+";
    $aChainesKO[] = "a&";
    $aChainesKO[] = "a7";
    $aChainesKO[] = "a-%";
    $aChainesKO[] = "a-a {";
    $aChainesKO[] = "aT _";
    $aChainesKO[] = "a-%";
    Actuellement, j'ai le motif suivant mais ne semble pas suffir...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern  = "`^[a-zA-Z-]+$`";
    Une aide serait donc la bienvenue.
    Merci d'avance

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Il faut que tu utilises des alternatives : http://g-rossolini.developpez.com/tu...e=page_2#LII-2

  3. #3
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    merci mais les chaines que j'ai fournit ne sont que des exemples pour trouver le bon motif... du coup, je ne vois pas comment faire (même avec ton lien).

  4. #4
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Clairement, que cherches-tu à faire ? Interdire tout ce qui n'est ni "espace" ni "lettre" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #^[a-z éèàùÉÈÀêÊçÇ]+$#iD
    Sinon, tu peux aussi utiliser Unicode et valider en fonction de ça

  5. #5
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    euhhhhhhhhh, en faite, je souhaiterai tout simplement tester des prénoms (comportant donc minuscules, majuscules, espaces, traits d'union, accents)...
    C'est sûr... c'est clair ainsi.

  6. #6
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    bon je suis proche du but...
    Je pense avoir un truc pas trop mal avec ce motif : `^[-a-zA-Zéàèêùôîï ]+$`
    cependant, je n'arrive pas encore à empêcher une chaine se terminant par un tiret..

    Une idée ?

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    Place ton tiret à la fin de la classe :

    `^[a-zA-Zéàèêùôîï -]+$`
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  8. #8
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    ça la même chose, apparemment le tiret peut se mettre en début ou en fin...
    mais comment l'empêcher en fin de chaine ?

  9. #9
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    interdiction de l'espace et du tiret en fin de chaîne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    `^[a-zA-Zéàèêùôîï -]+[a-zA-Zéàèêùôîï]$`
    Tu peux aussi essayer comme ça pour simplifier la gestion de la casse et des accents :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    `^[[:alpha:] -]+[[:alpha:]]$`

    Tu utilises les preg ou les ereg ?
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  10. #10
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    tout d'abord, merci beaucoup pour ton aide Antoun.

    Citation Envoyé par Antoun Voir le message
    Tu utilises les preg ou les ereg ?
    j'utilise preg_match($pattern, $chaine) (voir "PCRE" dans le titre)

    avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern  = "`^[a-zA-Zéàèêùôîï -]*[a-zA-Zéàèêùôîï]$`";
    semble être bon, mais effectivement la gestion des accents est lourde et hasardeuse...

    avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern  = "`^[[:alpha:] -]*[[:alpha:]]$`";
    je n'arrive pas à gérer les accents alors que d'après la doc (ICI) la classe [:alpha:] doit le faire...
    > d'où vient le problème ?
    Aussi, j'ai remplacé le + par une *...

  11. #11
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Est-ce que tu as bien appelé setlocale() avant d'appeler la regex ?

  12. #12
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    nan mais je viens d'essayer...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $charset = 'fr_FR.ISO8859-1';
    $charset = 'fr_FR.UTF-8';
    $charset = 'fr_FR';
     
    if (setlocale(LC_ALL, $charset) === FALSE)
    	echo "<p>Erreur avec setlocale(LC_ALL, '".$charset."')</p>";
    dans les 3 cas, j'obtiens le message !


  13. #13
    Membre habitué
    Avatar de savageman86
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 105
    Points : 199
    Points
    199
    Par défaut
    et avec \w au lieu de [alpha] ? (ça te prend le caractère _ en plus je crois bien, mais les accents doivent être bons).

  14. #14
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    merci savageman86 pour l'idée mais cela ne fonctionne pas mieux...
    c'est même moins bien puisque cette classe permet les chiffres et "_" (que je ne souhaite pas)

  15. #15
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    En fait, le plus simple est d'utiliser iconv :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo iconv('utf-8', 'us-ascii//TRANSLIT', $string);

  16. #16
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    merci Yogui pour ton idée. Je ne connaissais pas iconv. Cependant, j'ai adapté ton exemple par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $chaine = iconv('utf-8', 'ISO8859-1', $chaine);
    et là effectivement les accents semblent être détectés et autorisés...


    Sinon, pour info, j'ai refait des tests de setlocale(). Voici mes résultats sur ma config (WAMP1.6.6 que j'upgraderais plus tard) :
    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
     
    $aCharset = array();
    $aCharset[] = 'fr_FR.ISO8859-1';
    $aCharset[] = 'fr_FR.UTF-8';
    $aCharset[] = 'fr_FR';
    $aCharset[] = 'fr';
    $aCharset[] = 'french';
     
    foreach($aCharset as $key=>$charset) {
    	echo "<p>Avec charset = <strong>'".$charset."'</strong></p>";
    	$locale = setlocale(LC_ALL, $charset);	
    	if ($locale === FALSE) {
    		echo "<p>Erreur avec setlocale(LC_ALL, '".$charset."')</p>";
    	} else {
    		echo "<p>setlocal:".$locale."</p>";
    	}
    	echo "<p>".strftime("%A %d %B %Y %T")."</p><hr />";
    }
    ?>
    affiche
    Avec charset = 'fr_FR.ISO8859-1'
    Erreur avec setlocale(LC_ALL, 'fr_FR.ISO8859-1')
    Monday 09 June 2008
    _____________________________________
    Avec charset = 'fr_FR.UTF-8'
    Erreur avec setlocale(LC_ALL, 'fr_FR.UTF-8')
    Monday 09 June 2008
    _____________________________________
    Avec charset = 'fr_FR'
    Erreur avec setlocale(LC_ALL, 'fr_FR')
    Monday 09 June 2008
    _____________________________________
    Avec charset = 'fr'
    setlocal:French_France.1252
    lundi 09 juin 2008
    _____________________________________
    Avec charset = 'french'
    setlocal:French_France.1252
    lundi 09 juin 2008
    donc seul les 2 derniers ("fr" et "french") semblent agir... cependant, aucun n'influence preg_match()
    Bug de ma version de php ?
    Quelqu'un pourrait-il tester avec une version récente l'utilisation conjointe de setlocale() et preg_match() en UTF-8 + accents ? Merci d'avance à celui qui prendra un peu de son temps.

    ...

Discussions similaires

  1. Recherche d'une regex toute simple (mais pas pour moi)
    Par rambc dans le forum Général Python
    Réponses: 7
    Dernier message: 15/04/2009, 15h23
  2. simple mais introuvable
    Par bibiweb dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/10/2007, 22h10
  3. Requête peut être simple, mais compliquée pour moi !
    Par xfree dans le forum Langage SQL
    Réponses: 11
    Dernier message: 17/08/2007, 16h09
  4. éditeurs simples mais pratiques pour un newbie
    Par Eusebius dans le forum Apple
    Réponses: 7
    Dernier message: 24/04/2007, 17h42
  5. Réponses: 6
    Dernier message: 27/04/2005, 15h46

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