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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    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 chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    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
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    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 chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    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 Expert 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
    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 Expert
    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
    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
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    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

+ 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