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 :

regex avec preg_match [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur
    Inscrit en
    Octobre 2014
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 322
    Points : 124
    Points
    124
    Par défaut regex avec preg_match
    Bonjour,

    J'ai une regex fonctionnelle, en JS ne n'est aucun problème avec.
    Par contre en PHP, outre le fait qu'il convertie "€" en "€\" dans ma regex, alors que le code "normal" c'est "€" et je pense que c'est pour l'antislash qu'il rajoute qui fout la merde.

    Voici ma regex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "/^(?=.{1,}[a-z])(?=.{2,}[A-Z])(?=.{1,}[0-9])(?=.{1,}[&#@=€$%*?/:!-+])([a-zA-Z0-9&#@=€$%*?\\/:!\\-+]){8,}\$/"
    Regex dans PHP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "/^(?=.{1,}[a-z])(?=.{2,}[A-Z])(?=.{1,}[0-9])(?=.{1,}[&#@=€\$%*?/:!-+])([a-zA-Z0-9&#@=€\$%*?\\/:!\\-+]){8,}\$/"
    preg_match me renvoie FALSE, donc une erreur lors de l’exécution, je ne comprends pas comment contourner le problème.

    Je vous mets quand le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            $pattern = $regex->regexMdp($result); //récupération de la regex généré
            $pattern = "/".$pattern."/"; //ajout des delimiteurs (non utilise en JS)
    	$ok=preg_match($pattern,$value);
    J'espère que vous aller pouvoir m'aider, car la je sèche complètement.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    ...outre le fait qu'il convertie "€" en "€\"...
    Qui ça, "il" ??

    • Ce n'est pas toi qui écris le code ?
    • Où tu n'es pas en utf-8 ?

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur
    Inscrit en
    Octobre 2014
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 322
    Points : 124
    Points
    124
    Par défaut
    Désolé pour la formulation hasardeuse.

    Tous mes fichiers sont en UTF-8.

    Je récupère a partir d'un WS la liste des caractères spéciaux autorisés.

    Donc j'ai créer un script qui génère la regex.

    Mon IDE (en debug), transforme le "€" en "€\", je pense comprendre pourquoi étant donné que c'est un caractère "rajouter".

    Mais ce que je ne comprends pas, c'est pourquoi le preg_match me retourne FALSE.
    Ma regex fonctionne correctement en JS et meme sur différents site de test de regex.

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur
    Inscrit en
    Octobre 2014
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 322
    Points : 124
    Points
    124
    Par défaut
    Après plusieurs essais.

    J'ai supprimé le "€" de la ragex et l'antislash est pour "$", étant donné que c'est pour indiquer le début d'une variable.

    c'est bien sympa, mais la PHP me fait chier avec son antislash.

    J'ai essayé avec stripslashes mais toujours la problème de l'antislash.

    Bon après avoir refait des tests, remis le code comme avant, ça fonctionne...

    Qu'est ce que j'aime PHP.


    J'en ai marre de pas avoir la main sur tout avec PHP, comment peut on aimer ce langage....

  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
    Citation Envoyé par Math71 Voir le message
    J'ai une regex fonctionnelle, en JS ne n'est aucun problème avec.
    Et pourtant elle est archi-fausse!
    ^(?=.{2,}[A-Z]) ne garantit absolument pas que la chaîne contient au moins deux majuscules. Tout ce qu'elle fait, c'est de vérifier qu'à partir du deuxième caractère de la chaîne il y a au moins une majuscule.
    Pour tester qu'il y a au moins deux majuscules, il faudrait écrire: ^(?=(?:[^A-Z]*[A-Z]){2}).
    Au lieu de te battre à essayer d'échapper tout ce qui bouge avec stripslash() ou str_replace(), utilise preg_quote() qui est justement fait pour les regex.

    Bref avec ton script de génération, ça donnerait ça:
    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
    $regexMdp = '/^';
     
    if ( $policy->nombreMinuscules > 0 )
        $regexMdp .= '(?=(?:[^a-z]*[a-z]){' . $policy->nombreMinuscules . '})';
     
    if ( $policy->nombreMajuscules > 0 )
        $regexMdp .= '(?=(?:[^A-Z]*[A-Z]){' . $policy->nombreMajuscules . '})';
     
    if ( $policy->nombreChiffres > 0 )
        $regexMdp .= '(?=(?:[^0-9]*[0-9]){' . $policy->nombreChiffres . '})';
     
    $specialChars = preg_quote($policy->listeCharSpeciaux, '/');
     
    if ( $policy->nombreCharSpeciaux > 0 ) {
        $regexMdp .= '(?=(?:[^' . $specialChars . '][' . $specialChars . ']){'
                   . $policy->nombreCharSpeciaux . '})';
    }
     
    $allowedChars = 'A-Za-z0-9' . $specialChars;
     
    $regexMdp .= '[' . $allowedChars . ']{' . $policy->longueur . ',}$/uD';
    Le modificateur u permet, entre autre, de lire correctement une pattern ainsi que la chaîne cible en utf8. Le modificateur D interdit à l'ancre $ de réussir si elle est suivie d'une nouvelle ligne (comme c'est le cas par défaut).

    Par contre en PHP, outre le fait qu'il convertie "€"...
    PHP ne convertit rien du tout et n'a rien à voir la dedans! Si tu obtiens des caractères bizarres, ça vient sûrement de ce qui l'affiche (ton IDE, ton browser, ton terminal ...) qui n'est soit pas informé que ce qu'il affiche est de l'utf8 ( c'est le cas quand on oublie <meta charset="UTF-8"/> dans une page web, ou quand son système ou son IDE est réglé sur un autre jeu de caractères.)
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

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

Discussions similaires

  1. [RegEx] Regex avec condition
    Par yudao dans le forum Langage
    Réponses: 6
    Dernier message: 29/05/2007, 15h08
  2. [RegEx] soucis avec preg_match
    Par cassy dans le forum Langage
    Réponses: 3
    Dernier message: 18/04/2007, 15h33
  3. [RegEx] validation avec preg_match
    Par G_Kill dans le forum Langage
    Réponses: 2
    Dernier message: 15/11/2006, 00h45
  4. REGEX avec variable
    Par Mat_F dans le forum Langage
    Réponses: 3
    Dernier message: 21/07/2006, 19h24
  5. Problème de Regex ... avec un point
    Par bugalood dans le forum Langage
    Réponses: 2
    Dernier message: 29/05/2005, 10h26

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