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 :

Tester une variable (immatriculation) [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 181
    Points : 114
    Points
    114
    Par défaut Tester une variable (immatriculation)
    Bonjour,

    Je souhaiterai pouvoir tester des variables entrées par des visiteurs, et n'autoriser que les formats existants pour les plaques d'immatriculations françaises.

    C'est à dire :

    X : chiffres
    Y : lettres

    ancienne : XXXX YY XX
    nouvelle : YY XXX YY
    mobylette : YY XXX Y

    Existe t'il une solution assez simple pour tester ces formats ? Sachant qu'en plus le XXXX YY XX peut avoir que 3 chiffres de mémoire : XXX YY XX , sans oublier les Corses 2A - 2B à la fin.

    Merci d'avance !
    Nicolas

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Et voilà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ancienne  = "1234 AB 04";
    $ancienne2 = "123 AB 04";
    $nouvelle  = "AB 1234 CD";
    $mobylette = "AB 123 C";
    $corse     = "1234 AB 2A";
     
     
    $pattern   = '~(\d{3,4}\s*[a-z]{2}\s*(\d{2}|\d[a-z])|[a-z]{2}\s*\d{4}\s*[a-z]{2}|[a-z]{2}\s*\d{3}\s*[a-z])~iu';
     
    var_dump( (bool)preg_match($pattern, $ancienne ) );
    var_dump( (bool)preg_match($pattern, $nouvelle ) );
    var_dump( (bool)preg_match($pattern, $mobylette) );
    var_dump( (bool)preg_match($pattern, $ancienne2) );
    var_dump( (bool)preg_match($pattern, $corse    ) );
    L'usage des expressions régulières me parait tout à fait justifié, l'expression montré ci dessus valide les trois formes de manière insensible à la casse et les espaces ne sont pas requis pour la validation.
    Je te recommande toutefois de faire un trim sur les variables avant de les valider avec preg_match.

  3. #3
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Mouais... enfin, les anciennes immat, c'est quand même un peu plus compliqué que ça
    Dans la version "tout venant" (donc hors véhicules spéciaux), tu peux avoir trois lettres, mais dans ce cas, tu n'as que trois chiffres initiaux maxi (sachant que théoriquement, il peut y en avoir un, deux, trois ou quatre).
    D'autre part, certaines lettres sont interdites (I, O et U pour éviter de confondre avec 1, 0 ou V) ainsi que, en fonction des préfectures, certaines combinaisons comme PD, PQ, SS, ...
    Sans oublier les DOM-TOM pour les départements

    http://fr.wikipedia.org/wiki/Plaque_...fran%C3%A7aise
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  4. #4
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Ok, moi j'ai fait selon les désidératas de nicoreims, j'ai pas la moindre idée de comment se mets en forme une immatriculation

    Si tu me donne toutes les règles à appliquer je veux bien t'aider à faire la regexp qui les exprime

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 181
    Points : 114
    Points
    114
    Par défaut
    Merci tout le monde pour votre aide, merci Benjamin.

    Après réflexion , le plus simple serait uniquement de vérifier la longueur maxi total (9 maxi par exemple) l'alternance chiffre/lettre avec 4 maxi de chaque, sachant qu'ensuite je vais modérer les inscriptions.

    Pourriez-vous m'aider pour cette vérification ?
    Merci d'avance

  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (strlen($str) <= 9 && (bool)preg_match('~\d{,4}\s*[a-z]{,4}\s*\d{,4}~iu', $str))
     ...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 181
    Points : 114
    Points
    114
    Par défaut
    Merci Benjamin ! Je vais tester .

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 181
    Points : 114
    Points
    114
    Par défaut
    Bonjour Benjamin,

    J'ai testé, malgré plusieurs essais , ça m'affiche toujours "bad"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $str="1950ee75";
     
    if (strlen($str) <= 9 && (bool)preg_match('~\d{,4}\s*[a-z]{,4}\s*\d{,4}~iu', $str))
    {
    echo "good";
    }
    else
    {
    echo "bad";
    }
    Merci d'avance

  9. #9
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Woops, petit problème dans les répétitions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $str="1950ee75";
     
    if (strlen($str) <= 9 && (bool)preg_match('~\d{1,4}\s*[a-z]{1,4}\s*\d{1,4}~iu', $str))
    {
    echo "good";// good !
    }
    else
    {
    echo "bad";
    }

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 181
    Points : 114
    Points
    114
    Par défaut
    Merci Benjamin

  11. #11
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Au passage, tu devrais lire cet article sur les expressions régulières: http://g-rossolini.developpez.com/tutoriels/php/regex/
    Les expressions régulières sont cruciales dans beaucoup de projet, c'est terriblement puissant mais garde à l'esprit que c'est un mécanisme assez lourd qui doit être évité autant que possible.

    Quelques cas classiques où les expression régulières sont à éviter:
    • trouver des éléments ou des valeurs dans un flux XML (ou HTML) se fait plus facilement (et surtout plus pertinement) avec DOMDocument ou SimpleXML
    • trouver une sous chaine dans une chaine se fait plus rapidement avec strpos ou stripos
    • remplacer des sous chaines dans une chaine se fait plus rapidement avec str_replace
    • découper une chaine selon un token se fait plus rapidement avec explode, spit ou strtok
    • regrouper une collection sous forme de chaine se fait plus rapidement avec implode ou join
    • extraire une sous chaine dans une chaine peu complexe se fait plus rapidement avec strpos ou stripos et substr


    Il vaut souvent mieux utiliser une combinaison de fonctions de manipulation de chaines que d'utiliser des expressions régulières (tant que cela ne nuit pas à la compréhension du code source). Dans tous les cas, il faut garder à l'esprit qu'une solution élégante est une solution facile à écrire et à comprendre.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 181
    Points : 114
    Points
    114
    Par défaut
    Bonjour Benjamin, oui j'ai décidé hier soir de m'y mettre, j'ai trouvé une très bonne doc hier + la tienne. Aux premiers abords les regex semblent compliqués, mais il suffit de s'y mettre, merci pour ton aide.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 181
    Points : 114
    Points
    114
    Par défaut
    Malgré toutes mes recherches, je n'arrive pas à trouver à quoi sert le u

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (strlen($str) <= 9 && (bool)preg_match('~\d{1,4}\s*[a-z]{1,4}\s*\d{1,4}~iu', $str))
    Merci d'avance

  14. #14
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 181
    Points : 114
    Points
    114
    Par défaut
    Merci beaucoup, par contre je n'ai rien compris ?!

    U (PCRE_UNGREEDY)
    Cette option inverse la tendance à la gourmandise des expressions rationnelles. Vous pouvez aussi inverser cette tendance au coup par coup avec un ? mais cela rendra gourmand la séquence. Cette option n'est pas compatible avec Perl. Elle peut aussi être mise dans le masque avec l'option ?U dans le pattern ou par un point d'interrogation avant le quantificateur (.e.g. .*?).

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 181
    Points : 114
    Points
    114
    Par défaut
    Bonjour,

    J'ai trouvé comment gérer les 2 formats d'immatriculation avec ses 2 lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (strlen($str) <= 9 && (bool)preg_match('~\d{1,4}\s*[a-z]{1,4}\s*\d{1,2}~iu', $str))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (strlen($str) <= 7 && (bool)preg_match('~[a-z]{1,2}\s*\d{1,3}\s*[a-z]{1,2}~iu', $str))
    Auriez-vous une idée de comment faire pour les regrouper en une seule ?

    Merci d'avance

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 181
    Points : 114
    Points
    114
    Par défaut
    Bonjour,

    J'ai trouvé un bug sur le test des anciennes plaques et réussi à passer des plaques au format inexistant.
    Je me suis donc penché sur le code, j'ai vu qu'il n'y avait pas de test de début de champ ^et de fin $.

    A quoi sert ~ ? je n'ai pas trouvé .

    Avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (strlen($str) <= 9 && (bool)preg_match('~\d{1,4}\s*[a-z]{1,4}\s*\d{1,2}~iu', $str))
    J'ai donc simplifié le script , et cela semble fonctionner

    Après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (strlen($var) <= 9 && preg_match("#^[0-9]{1,4}+[A-Z]{1,4}+[0-9]{1,2}$#", $var)) {   echo "ancienne plaque : $var"  ;}
    La syntaxe vous semble t'il correcte ?
    Merci d'avance

  18. #18
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    A quoi sert ~ ? je n'ai pas trouvé .
    A la même chose que "#" pour toi...
    Délimiteurs

    La syntaxe vous semble t'il correcte ?
    Non... à quoi servent les "+" ?
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 181
    Points : 114
    Points
    114
    Par défaut
    Merci à tous

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/09/2006, 21h08
  2. tester une variable
    Par NeHuS dans le forum ASP
    Réponses: 2
    Dernier message: 17/02/2006, 15h38
  3. [coldfusion] Tester une variable
    Par mandaillou dans le forum Coldfusion
    Réponses: 1
    Dernier message: 29/09/2005, 11h04
  4. Tester une variable
    Par ZiT dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/07/2005, 14h49
  5. NASM Tester une variable d'environnement à la "compilat
    Par Pierre Maurette dans le forum Assembleur
    Réponses: 1
    Dernier message: 10/06/2005, 13h27

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