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 :

Demande speciale expression reguliere


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Par défaut Demande speciale expression reguliere
    Bonjour,

    Après des heures passées a chercher, a tester mais sans succès, car j'ai vraiment du mal à capter comment marche les expressions régulières je me permet de vous demander ceci :

    Pourriez vous me donner les expressions régulières adéquates a mon projet ?
    Pour infos, il s'agit de vérifier les champs d'un formulaire avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match('`xxxxx`',$xxxxx)
    moi j'ai utiliser ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match('`^\w{3,150}$`',$xxxxx)
    mais il ne fait pas ce que je souhaite.

    Premiere expression :

    Ce champs est destiné à un titre de livre, donc tous les caracteres alphanumeriques, majuscule et minuscule, avec accent, les deux point : et tiret du 6 seulement.

    si seulement un ou plusieurs espaces saisies sans autres caracteres ===> faux
    si moin de 3 caracteres ===> faux
    si plus de 150 caracteres ===> faux
    si un des caracteres suivant > < = + { } [ ] | & # " € $ £ ¤ % * / \ ; _ @ § ! ? . ~`° saisie ===> faux

    Pour exemple :

    Saisie n°1 : " " ===> faux (un espace de saisie seulement)
    Saisie n°2 : " hhhh" ===> faux (puisque un espace devant)
    Saisie n°3 : "hhhh " ===> faux (puisque un espace derriere)
    Saisie n°4 : "hhhh hhh" === faux (puisque 2 espaces entre les mots) Pour 2 espace entre deux mot il me semble que le deuxieme espace est supprimer automatiquement mais je ne suis pas sur.
    Saisie n°5 : "<?php include..." === faux (puisque caractere non autorisé)

    Saisie n°6 "L'escalier était sûr" ===> bon (puisque caractere autorisé)


    Deuxieme expression :

    Champs de description, tous les caracteres sauf : > < { } | ¤ § ~`



    Troisieme expression :

    Un peut plus facile puisque il s'agit d'un prix.

    Seule les caracteres numeriques, le . (point) et la , (virgule) avec 2 decimal seulement pour les centimes.

    Exemple :

    Saisie n°1 : "10.00" ===> bon
    Saisie n°2 : "10000.00" ===> bon
    Saisie n°3 : "10.000" ===> faux (3 caractere centime)
    Saisie n°3 : "10.00€" ===> faux (caractere non autorisé)
    Saisie n°4 : "cent euro" ===> faux (caractere non autorisé)


    Voilà, c'est tout pour le moment. Si vous avez des meilleurs idées je suis prenneur, ou des site avec des expression toute faite... (je me suis aider de ceux la mais j'ai trop de mal : pour tester et http://www.expreg.com/.
    Le mieux c'est que quelqu'un me donne la solution directement, je sais solution de facilité mais j'ai perdu trop de temps pour ce détail !

    J'espere ne pas abuser de votre hospitalité !

    Merci

  2. #2
    Membre Expert Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Par défaut
    Pour l'expression 1 tu ne doit pas être loin avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    // Sans les accents
    $str = "Voici le titre d'un Livre Numero-1:";
     
    if(preg_match('/^([a-zA-Z0-9 \':-]+)$/', $str)) echo "Vrai<br>";
    else echo "Faux<br>";
     
    // Avec les accents
    $str = "Le tableau du maître flamand d'Arturo Pérez-Reverte";
     
    if(preg_match('/^([ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿa-zA-Z0-9 \':-]+)$/', $str)) echo "Vrai<br>";
    else echo "Faux<br>";
    ?>
    Pour supprimer les espace avant et après tu as la fonction trim()

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Bonjour,


    Pour le premier champ

    Les caractères > < = + { } [ ] | & # " € $ £ ¤ % * / \ ; _ @ § ! ? . ~`° seront automatiquement refusés s’ils ne sont pas inscrits dans l’ensemble que tu définis comme celui des caractères que tu souhaite autorisés :
    tous les caracteres alphanumeriques, majuscule et minuscule, avec accent, les deux point : et tiret du 6 seulement.
    Il suffit de définir ce dernier ensemble et on ne se préoccupera plus des premiers caractères à refuser.



    [a-zA-Z0-9] autorise l’ensemble des caractères 'abcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'

    En Python, \w définit le même ensemble + le caractère underscore ’_’ , et pas les caractères accentués,
    c’est à dire que \w est équivalent à [A-Za-z0-9_]

    Mais d’après ce que j’ai lu, en PHP \w symbolise [A-Za-z0-9_] et en outre les caractères accentués aussi:
    http://www.lumadis.be/regex/tuto_pcre.php



    Il faudrait savoir quels sont les accentués que tu veux accepter pour tes entrées.
    Ceux utilisés en français sont:
    à â ù û ü ç ÿ é è ê ë ï î ô œ À Â Ù Û Ü Ÿ Ç É È Ê Ë Ï Î Ô Œ
    Mais il en existe d’autres encore, dans d’autres langues:
    æ ø ó ş ğ ő á å ř č ď ů etc



    Une fois précisés quels sont les accentués que tu veux accepter en entrée, il faudra voir comment tu pourras spécifier ces accentués.




    Même si le symbole \w recouvre la symbolisation d’accentués en PHP, le fait qu’il symbolise aussi l’underscore empêche d’utiliser \w pour cet usage que tu as défini.

    Faudra-t-il ajouter les accentués un par un dans la classe [a-zA-Z0-9] ?

    Il y a peut être une solution pour éviter cette inscription explicite des accentués dans ta RE avec l’emploi d’une classe POSIX.

    En PHP, les classes POSIX sont acceptées au sein de classes PCRE, et uniquement dans elles.
    Or la méta-classe POSIX [:alpha:] symbolise des caractères alphabétiques, en excluant l’underscore ’-’. Il suffit donc de définir [0-9[:alpha:]] pour obtenir un symbole de tout caractère alphanumérique uniquement.
    Mais ce qui nous intéresse surtout c’est que les caractères accentués sont couverts par [:alpha:] si la locale installée le permet.

    Je ne maîtrise pas les histoires de locale sous PHP, il va donc falloir te débrouiller tout seul avec par exemple ces liens
    http://www.lumadis.be/regex/tuto_pcre.php
    http://documentation-php.supportduwe...umentation-php
    pour déterminer quels sont les jeux de caractères définis par ta locale, et changer éventuellement celle-ci.



    Tout ça pour dire qu’il te sera peut être possible de représenter la classe de caractères que tu souhaites autoriser par simplement
    [:0-9[:alpha:]-]
    Sinon tu seras obligé d’incorporer à la main tous les caractères accentués que tu souhaites autoriser, par exemple:
    [:0-9a-zA_ZàâùûüçÿéèêëïîôœÀÂÙÛÜŸÇÉÈÊËÏÎÔŒ-]
    et ceux d’autres langues si besoin.

    Pourquoi ne pas ajouter aussi quelques caractères de monnaies ?
    $ € ¢ £ ¥ ฿ .....








    Tout ceci étant précisé, en définissant la variable suivante pour simplifier l’écriture de la RE:
    soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $aut = ’[:0-9[:alpha:]-]
    soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $aut = ’[:0-9a-zA_ZàâùûüçÿéèêëïîôœÀÂÙÛÜŸÇÉÈÊËÏÎÔŒ-]
    selon ce que tu prendras, j’ai trouvé comme RE pour ton premier champ:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $RE = 
       '`^’ + $aut 
    + '(’ +$aut+’{2}|’ + $aut + ’)'
    + '(?! +)'
    + '(’ +$aut + ’| (?! +)){0,147}(?<! )\z`')
    Ça ne prétend pas être une écriture PHP orthodoxe.



    Si je ne me suis pas trompé , cela correspond à la succession des éléments suivants (en prenant la première écriture de $aut):


    ^[:0-9[:alpha:]-]
    Comme le premier caractère ne peut pas être un blanc, ce ne peut être qu’un des caractères autorisés


    ([:0-9[:alpha:]-]{2}| [:0-9[:alpha:]-]
    Il doit y avoir au moins 3 caractères dans l’entrée. Cet élément spécifie donc les caractères numéros 2 et 3.
    [:0-9[:alpha:]-]{2} symbolise que ce peut être deux caractères autorisés
    .[:0-9[:alpha:]-] autorise quant à lui un blanc comme second caractère de l’entrée (il y a un blanc en tête de l’écriture en question), et un caractère autorisé comme 3 ième caractère de l’entrée. Ce n’est peut être pas ce que tu souhaites, auquel cas tu enleveras cette moitié de cet élément
    Le caractère | signifie OU


    (?!..+)
    Il y a deux blancs devant +
    Le premier blanc est là pour représenter un blanc.
    Puis ’ +’ signifie ’au moins un blanc.
    Donc ’..+’ signifie ’au moins 2 blancs.
    Et comme c’est dans une assertion négative, l’élément complet signifie: “à la position correspondante dans la chaîne explorée, il ne devra pas y avoir deux blancs successifs“.
    Ce qui élimine toute possibilité que les 3 premiers caractères obligatoires soient suivis de 2 ou plus de 2 blancs.


    L’élément ([:0-9[:alpha:]-]| (?! +)){0,147}(?<! )\Z
    est composé de 3 morceaux
    • Le morceau {0,147} spécifie que le caractère défini par le premier morceau doit être absent ou présent sans pouvoir dépasser 147 fois. Évidemment 147 = 150-3 premiers caractères obligatoires.
    • Le premier morceau ([:0-9[:alpha:]-]| (?! +)) spécifie un caractère qui peut être soit [:0-9[:alpha:]-] , soit un blanc à condition que ce blanc ne soit pas suivi d’un deuxième blanc.
    • Le troisième morceau oblige à ce que la RE matche jusqu’à la fin de la chaîne, et que le dernier caractère qui précède la fin ne soit pas un blanc.






    Pour le second champ


    devrait convenir






    Pour le troisième champ,


    je vais, peut être, y réfléchir,

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Par défaut
    Merci pour vos réponse éclairante, je vais testé tout ça.

    J'ai juste une question :

    Les slash au debut et à la fin de /^([ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿa-zA-Z0-9 \':-]+)$/ correspondent à quoi exactement ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Par défaut
    Messieurs rien ne marche comme je le souhaite pour le premier champs...

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Ce sont les délimiteurs, nécessaires en PHP.

    Le premier est celui qui ouvre,

    le deuxième ferme et sépare la RE proprement dite des options éventuelles.



    Dans l’expression de riete il n’y a pas d’options indiquées.

    http://fr2.php.net/manual/fr/regexp....delimiters.php

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Moi ça marche. Mes essais sont faits en Python.
    As tu un message d’erreur, ou bien les résultats sont ils faux ?

Discussions similaires

  1. Réponses: 7
    Dernier message: 02/04/2004, 10h47
  2. [langage] [debutant] expression reguliere
    Par toto_titi dans le forum Langage
    Réponses: 3
    Dernier message: 01/07/2003, 09h45
  3. Réponses: 2
    Dernier message: 16/06/2003, 15h15
  4. [langage] surement une expression régulière...
    Par armada dans le forum Langage
    Réponses: 5
    Dernier message: 30/05/2003, 17h06
  5. [langage] expression reguliere motif répétitif dans 1 pattern
    Par comme de bien entendu dans le forum Langage
    Réponses: 11
    Dernier message: 09/04/2003, 16h14

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