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 :

Mon regex doit accepter les point [RegEx]


Sujet :

Langage PHP

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 098
    Points : 946
    Points
    946
    Par défaut Mon regex doit accepter les point
    Bonjour à tous,
    Je ne suis as trop un expert avec les regex et je dois modifier un petit code pour que les point soit accepter dans un nombre
    exemple
    9.23
    J'ai ceci et avec ca, le point n'est pas accepter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (!preg_match("/^[0-9][0-9]*$/",$fieldValue)
    (par exemple 0.10 me retourne une erreur alors que ca ne devrait pas)

    Pourriez-vous me corriger?

    Merci beaucoup

  2. #2
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    bonjour,

    Bon déjà, si tu ne mets pas le fameux point dans ta regex, c'est normal qu'il ne soit pas "accepté".

    Ensuite, de mémoire, le point fait partie des méta-caractères (# ! ^ $ ( ) [ ] { } ? + * . \ |) donc il faut l'échapper avec un anti slash.

    pas testé mais ça devrait être un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (!preg_match("/^[0-9]\.[0-9]{1,2}$/", $fieldValue)
    En remarque, les digits existent sous forme de classe abrégée (\d), donc tu devrais aussi pouvoir l'écrire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (!preg_match("/^\d\.\d{1,2}$/", $fieldValue)

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 098
    Points : 946
    Points
    946
    Par défaut
    ha ok,
    Je viens à l'instant de trouver un truc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (!preg_match("/^[0-9.][0-9.]*$/",$fieldValue)
    J'ai mis le point just après le 9.

    Ca semble marché, mais je n'ai absolmnt aucune idée de ce que ca fait.
    Aussi, ca vaut la peine de mettre deux fois [0-9.]?
    Qu'es-ce que ca veut dire exactement le deuxième.
    Et dernière question, qu'es-ce que ca fait le {1,2}, que tu as ajouté

  4. #4
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    si j'ai compris le pattern dont tu as besoin:

    1 digit de 0 à 9
    1 point
    1 nombre de 0 à 99

    Il te faut décomposer : "/^\d\.\d{1,2}$/"

    ^ : début de ton champ
    $ : fin de ton champ
    ^ ... $ : en d'autres termes, ton champ à analyser n'a pas de caractères avant ou après la regex. En clair si tu ajoutes un espace à la fin de $fieldValue, ça ne matchera jamais. Donc ajoutes peux-être un trim($fieldvalue) pour éviter ce genre d'erreur difficile à trouver après coup.

    En résumé :

    \d : 1 digit de 0 à 9

    \. : le fameux point doit être indiqué comme un caractère. Il faut l'anti slash car le point est un méta caractère qui signifie aussi "tout caractère" dans les regex


    \d{1,2} : entre 1 et 2 digits de 0 à 9

    Fais une recherche sur les tutos de regex, il y en a de très bons sur ce site:
    http://php.developpez.com/cours/?page=langage#regexp

  5. #5
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Citation Envoyé par pierrot10 Voir le message
    Ca semble marché, mais je n'ai absolmnt aucune idée de ce que ca fait.
    Littéralement, on pourrait dire :

    "Il ne faut pas que ce soit un nombre indéfinis de caractères qui soient constitués de chiffres ou de points."

    Ainsi, tu fais l'inverse à priori de ce que tu recherches puisque tu exclues tous les nombres.

    Tu peux utiliser ce code qui t'assures d'avoir au plus un seul point :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(preg_match("#^[0-9]+\.?[0-9]+$#",$fieldValue))
       echo 'je suis un nombre';

  6. #6
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    hé les mec, j'ai un truc qui marche et qui est plus puissant que tout:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $float = floatval($in);
    il faut accepter les points et les virgules comme séparateur? la belle affaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo floatval(str_replace(",",".", "33,57" ));

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 098
    Points : 946
    Points
    946
    Par défaut
    "Il ne faut pas que ce soit un nombre indéfinis de caractères qui soient constitués de chiffres ou de points."

    Ainsi, tu fais l'inverse à priori de ce que tu recherches puisque tu exclues tous les nombres.

    Tu peux utiliser ce code qui t'assures d'avoir au plus un seul point :
    Oui merci, bonne réflexion concernant les deux point possible. En effet il faut qu'il n'y ait qu'un point
    En fait je reprend ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(!preg_match("#^[0-9]+\.?[0-9]+$#",$fieldValue))
       echo 'Il y a une erreur';
    car j'ai besoin que ca me returne true sîl y a une erreur.

    Merci!!!

    gene66, je ne sais pas si le floatval() est une bonne idée. J'emregistre mes chiffre monétaire dans ma base de donnée en DECIMAL(5,2).
    Mais je ne sais pas trop.

    merci pour vos suggestions

  8. #8
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    @Gene : c'est pas un cast que l'on demande à ce que je sache

    Citation Envoyé par pierrot10 Voir le message
    car j'ai besoin que ca me returne true sîl y a une erreur.
    Tu peux faire une fonction alors :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function uneFonction($arg){
     
       if(!preg_match("#^[0-9]+\.?[0-9]+$#",$arg))
          return true;
     
       return false;
     
    }

  9. #9
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 098
    Points : 946
    Points
    946
    Par défaut
    oui merci beaucoup

  10. #10
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 098
    Points : 946
    Points
    946
    Par défaut
    Petit problème
    je viens de m'appercevoir que ceci $arg est de 1 à 9, il me returne true
    alors que si $arg est supérieur à 9 il me return false.
    En fait si mon nombre à une unité, ca coince alors que ca ne devrait pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(!preg_match("#^[0-9]+\.?[0-9]+$#",$arg))

  11. #11
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Remplace le dernier + de la regex qui veut dire 1 ou plus par un joker * voulant dire 0 ou plus

  12. #12
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 098
    Points : 946
    Points
    946
    Par défaut
    Ok super! merci.
    Petite dernire question, que veulent dire les deux # au debut et à la fin?

  13. #13
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    C'est un délimiteur qui peut être à peu près tous les caractères possibles. A toi d'en choisir un qui n'est pas présent dans ta regex. Tu peux remettre un / comme avant si tu veux, il n'y a pas de problème

  14. #14
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Petite amélioration te permettant de ne pas accepter les chaines se finissant par un point :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function uneFonction($arg){
     
       if(!preg_match("#^[0-9]+(\.[0-9]+)?$#",$arg))
          return true;
     
       return false;
     
    }

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/02/2012, 10h02
  2. [VBA] Mon code n'accepte pas les virgules.
    Par kubuntu_user dans le forum Général VBA
    Réponses: 3
    Dernier message: 29/12/2009, 11h27
  3. Mon projet n'accepte plus les modifications
    Par bache dans le forum VB.NET
    Réponses: 8
    Dernier message: 13/11/2007, 08h27
  4. La fonction BuilCriteria n'accepte pas les points
    Par Tofalu dans le forum Access
    Réponses: 3
    Dernier message: 10/07/2006, 12h00

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