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 :

Vérification de numéro de sécurité sociale [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 35
    Points : 18
    Points
    18
    Par défaut Vérification de numéro de sécurité sociale
    Maintenant je bloque sur la vérification d'un numéro de sécurité sociale.
    Tout marche sauf pour le Département de naissance, qui peut être soit un numéro de deux chiffres, soit 2A ou 2B (pour la corse).

    J'ai écris cela, mais le 2A ou 2B ou le numéro de deux chiffres ne passent pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(preg_match("#^[1-2][0-9]{2}[0-1][0-9][[2A-B]*][[[0-9]]*]{2}[0-9]{3}[0-9]{3}[0-9]{2}$#",$_POST['Secu_Enfant']))
    Merci d'avance pour votre aide !

  2. #2
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Très rapidement et sans avoir le temps de tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $myPattern = '/^          # début de chaîne
    [12]                      # 1 ou 2 pour le sexe
    [0-9]{2}[0-1][0-9]        # ça je me rappelle plus
    (2[AB]|[0-9]{2})       # le département
    [0-9]{3}[0-9]{3}[0-9]{2}  # ça non plus je ne sais plus
    $                         # fin de chaîne
    /x';
    if(preg_match($myPattern, $_POST['Secu_Enfant']))
    Attention à ne pas mélanger les parenthèses groupantes et les crochets qui indiquent une classe de caractères
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    J'ai essayé avec le numéro de sécu :
    et ça ne passe pas.

    Par contre avec ça marche.

    Voici ma regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(preg_match("#^[12][0-9]{2}[0-1][0-9](2[AB]|[0-9]{2})[0-9]{3}[0-9]{3}[0-9]{2}$#",$_POST['Secu_Pere']))

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    As-tu une idée de pourquoi cela ne marche pas ?

  5. #5
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Bizarre, chez moi ça passe.
    Tu es sûr de ton $_POST ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php
    print "<pre>";
     
    $myString = "253072B07300483";
    $myPattern = '#^[12][0-9]{2}[0-1][0-9](2[AB]|[0-9]{2})[0-9]{3}[0-9]{3}[0-9]{2}$#';
     
    preg_match($myPattern, $myString, $match);
     
    print_r($match);
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Ben oui je crois !

    Voici le code du formulaire HTML :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <label>
    Numéro de Sécurité Sociale :<br/><br/>
    <input type="text" name="Secu_Pere" size="45" value="<?php if (isset($_POST["Secu_Pere"])){ echo $_POST["Secu_Pere"];} ?>"/>
    </label><br/><br/><br/>
    Voici le code de la regex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(preg_match("#^[12][0-9]{2}[0-1][0-9](2[AB]|[0-9]{2})[0-9]{3}[0-9]{3}[0-9]{2}$#",$_POST['Secu_Pere']))
    Y'a-t-il un problème ?

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Ça marche pour moi aussi... Quelle est le numéro de SS que tu testes ? Il y a bien les deux derniers chiffres ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Pour compléter les commentaires et améliorer marginalement la regex en conséquence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $myPattern = '/^          # début de chaîne
    [12]                      # 1 ou 2 pour le sexe
    [0-9]{2}(0[1-9]|1[0-2])   # année et mois de naissance (aamm)
    (2[AB]|[0-9]{2})       # le département
    [0-9]{3}[0-9]{3} # numéro de série sur six chiffres
    ([0-9]{2})?             # numéro de contrôle (facultatif)  
    $                         # fin de chaîne
    /x';
    if(preg_match($myPattern, $_POST['Secu_Enfant']))
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  9. #9
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    En version causante avec les précisions de Antoun
    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
    22
     
    <?php
    $myString = "253072B07300483";
     
    $myPattern = '/^                        # début de chaîne
    (?<sexe>[12])                           # 1 ou 2 pour le sexe
    (?<naissance>[0-9]{2}(?:0[1-9]|1[0-2])) # année et mois de naissance (aamm)
    (?<departement>2[AB]|[0-9]{2})          # le département
    (?<numserie>[0-9]{6})                   # numéro de série sur six chiffres
    (?<controle>[0-9]{2})?                  # numéro de contrôle (facultatif)  
    $                                       # fin de chaîne
    /x';
     
    if (preg_match($myPattern, $myString, $match)) {
        print "<ul>";
        printf ("<li>sexe : %s</li>", $match['sexe']);
        printf ("<li>année et mois de naissance : %s</li>", $match['naissance']);
        printf ("<li>département : %s</li>", $match['departement']);
        printf ("<li>numéro de série : %s</li>", $match['numserie']);
        printf ("<li>controle : %s</li>", $match['controle']);
        print "</ul>";
    }
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Merci pour votre aide.
    J'essaye vos Regex dès que possible et vous tiens au courant du résultat.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Cela marche parfaitement avec 2A ou 2B ou deux chiffres ! Merci !

  12. #12
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 15
    Points : 17
    Points
    17
    Par défaut
    Au cas où quelqu'un tombe sur cette discussion. le premier chiffre n'est pas nécessairement un 1 ou un 2. Ce peut être un autre chiffre s'il s'agit d'un numéro de SS temporaire.
    Et la clé est égale au complément à 97 du numéro de sécurité social modulo 97.

    i.e.:
    clé = 97 - ([treize_premiers_chiffres] Mod 97)

  13. #13
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 12
    Points : 16
    Points
    16
    Par défaut
    Et oui quelqu'un est tombé sur la discussion
    J'apporte ma pierre à l'édifice en reprenant le code fournit il y a deux ans et en le faisant plus respecter le format du n° de sécu.
    Il serait possible (hors calcul de clef) de vérifier un numéro de sécurité sociale juste avec une expression régulière, mais elle serait encore plus compliqué que ce qui est fourni ci-dessous.

    J'ai donc préféré gérer une partie des exceptions en PHP (département outremer par exemple) car j'avais besoin de récupérer ces infos. Normalement, il y a tous les commentaires pour que vous compreniez pourquoi telle ou telle chose.

    Bref, si ça peut servir à quelqu'un, servez vous

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    <?php
     
    /**
     * Vérifie le numéro de sécurité sociale. S'il est valide, renvoit un tableau des infos
     * sinon renvoie FALSE
     * @author Webu (Dylann Cordel <d.cordel@webu.fr>)
     * @param string $numero à 15 chiffre
     * @return  mixed   array avec les infos récupérées du num de sécu ou FALSE
     */
    function checkNumSecu($numero){
        //Expression de base d'Antoun et SNAFU (http://www.developpez.net/forums/d677820/php/langage/regex/verification-numero-securite-sociale/#post3969560),
        //mais corigée par mes soins pour respecter plus scrupuleusement le format
        $regexp = '/^                                           # début de chaîne
    (?<sexe>[1278])                                             # 1 et 7 pour les hommes ou 2 et 8 pour les femmes
    (?<annee>[0-9]{2})                                          # année de naissance
    (?<mois>0[1-9]|1[0-2]|20)                                   # mois de naissance (si >= 20, c\'est qu\'on ne connaissait pas le mois de naissance de la personne
    (?<departement>[02][1-9]|2[AB]|[1345678][0-9]|9[012345789]) # le département : 01 à 19, 2A ou 2B, 21 à 95, 99 (attention, cas particulier hors métro traité hors expreg)
    (?<numcommune>[0-9]{3})                                     # numéro d\'ordre de la commune (attention car particuler pour hors métro  traité hors expression régulière)
    (?<numacte>00[1-9]|0[1-9][0-9]|[1-9][0-9]{2})               # numéro d\'ordre d\'acte de naissance dans le mois et la commune ou pays
    (?<clef>0[1-9]|[1-8][1-9]|9[1-7])?                          # numéro de contrôle (facultatif)
    $                                                           # fin de chaîne
    /x';
        //références : http://fr.wikipedia.org/wiki/Num%C3%A9ro_de_s%C3%A9curit%C3%A9_sociale_en_France#Signification_des_chiffres_du_NIR
     
        if(!preg_match($regexp, $numero, $match)){
            return FALSE ;
        }
        /* attention à l'overflow de php :)
          i.e :
        $test = '1850760057018' ;
        $clef = 97 - (substr($test, 0, 13) % 97) ;
        // => clef = 32 car l'opérande "%" travaille avec des entiers, et sur une archi 32 bits, 1850760057018 est transformé en 2147483647 ^_^
        $clef = 97 - fmod(substr($test, 0, 13), 97) ;
        // => clef = 18 (la valeur correcte, car fmod travaille avec des flottants)
         */
     
        $return = array(
            'sexe' => $match['sexe'],//7,8 => homme et femme ayant un num de sécu temporaire
            'annee' =>$match['annee'],//année de naissance + ou - un siècle uhuh
            'mois' =>$match['mois'],//20 = inconnu
            'departement' =>$match['departement'],//99 = étranger
            'numcommune' =>$match['numcommune'],//990 = inconnu
            'numacte' =>$match['numacte'],//001 à 999
            'clef' =>isset($match['clef'])?$match['clef']:NULL,//00 à 97
            'pays' =>'fra',//par défaut, on change que pour le cas spécifique
        );
     
        //base du calcul par défaut pour la clef (est modifié pour la corse)
        $aChecker = floatval(substr($numero, 0, 13));
     
        /*Traitement des cas des personnes nées hors métropole ou en corse*/
        switch(true){
            //départements corses. Le calcul de la cles est différent
            case $return['departement'] == '2A' :
                $aChecker = floatval(str_replace('A', 0, substr($numero, 0, 13)));
                $aChecker-= 1000000 ;
            break;
            case $return['departement'] == '2B' :
                $aChecker = floatval(str_replace('A', 0, substr($numero, 0, 13)));
                $aChecker-= 2000000 ;
            break;
     
            case $return['departement'] == 97 || $return['departement'] == 98 :
                $return['departement'].=substr($return['numcommun'], 0, 1);
                $return['numcommun'] = substr($return['numcommun'], 1, 2) ;
                if($return['numcommun'] > 90){//90 = commune inconnue
                    return FALSE ;
                }
            break;
     
            case $return['departement'] == 99 :
                $return['pays'] = $match['numcommune'] ;
                if($return['numcommun'] > 990){//990 = pays inconnu
                    return FALSE ;
                }
            break;
     
            default :
                if($return['numcommun'] > 990){//990 = commune inconnue
                    return FALSE ;
                }
            break;
        }
     
        $clef = 97 - fmod($aChecker, 97) ;
     
        if(empty($return['clef'])){
            $return['clef'] = $clef ; //la clef est optionnelle, si elle n'est pas spécifiée, le numéro est valide, mais on rajoute la clef
        }if($clef != $return['clef']){
            return FALSE ;
        }
     
        return $return ;
    }

  14. #14
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Bonjour!
    Discussion pas tout à fait résolue en fait... Magnifique code qui m'a été très utile mais 2 petites erreurs se sont glissées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    case $return['departement'] == '2B' :
                $aChecker = floatval(str_replace('A', 0, substr($numero, 0, 13)));
                $aChecker-= 2000000 ;
            break;
    Il faut remplacer le 'B' pas 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    case $return['departement'] == '2B' :
                $aChecker = floatval(str_replace('B', 0, substr($numero, 0, 13)));
                $aChecker-= 2000000 ;
            break;
    Et dans le regexp, (?<clef>0[1-9]|[1-8][1-9]|9[1-7])?
    doit être remplacé par (?<clef>0[1-9]|[1-8][0-9]|9[1-7])?

    Je dois avouer que la correction m'a été donnée par un ami mais je l'aurai trouvée aussi :-) Merci à Poulain

  15. #15
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut Validation selon les règles de la sécu.
    Salut à tous,

    Je cherchais une regexp pour valider un NIR (numéro de sécu)... et j'ai rien trouvé qui colle parfaitement aux règles de la sécu. La précédente regex était cependant assez proche de la réalité... avec quelques erreurs sur le clef de validation et quelques contrôles incomplets.

    Voici donc ce que j'ai fait, histoire de fournir une regexp détaillée selon les règles de la sécu listées sur Wikipédia.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $regexp = '/^                                           # début de chaîne
    (?<sexe>[12378])                                             # 1 et 7 pour les hommes ou 2 et 8 pour les femmes, 3 pour les transgenres
    (?<annee>[0-9]{2})                                          # année de naissance
    (?<mois>0[0-9]|1[12]|[23][0-9]|4[12]|[5-9][0-9])                                   # mois de naissance (si >= 20, c\'est que les informations sur l'acte de naissance sont incomplètes. Il y a différents cas 20 <= NIR <= 30 || 31 <= NIR <= 42 || 50<= NIR <= 99)
    (?<departement>2[AB]|0[1-9]|[1-9][0-9]) # 2A ou 2B pour la Corse... 96 utilisait à l'époque pour l'algérie, n'est plus attribué, mais la conversion en 99 a été possible mais pas systématique)
    (?<numcommune>00[1-9]|0[1-9][0-9]|[1-8][0-9]{2}|9[0-8][0-9]|990)                                     # numéro d\'ordre de la commune (attention car particuler pour hors métro  traité hors expression régulière)ou fin du numéro de département (971 à 978 et 98 pour les DOM-TOM) ou de pays, ...)
    (?<numacte>00[1-9]|0[1-9][0-9]|[1-9][0-9]{2})               # numéro d\'ordre d\'acte de naissance dans le mois et la commune ou pays
    (?<clef>0[1-9]|[1-8][0-9]|9[0-7])?                          # numéro de contrôle (facultatif)
    $                                                           # fin de chaîne
    /x';
    Il est possible de simplifier le mois de naissance ainsi : devient mais je trouve ça moins lisible, donc moins maintenable...
    Si , et la ont échoué mais pas nous, pensez à dire et cliquez sur . Merci !

    Ici, c'est un forum, pas une foire. Il y a de respectables règles... à respecter !

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    J'ai fait un test avec mon numéro de sécurité sociale et ça n'a pas marché.

    J'ai dû modifier la partie concernant le mois de naissance comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?<mois>0[0-9]|1[12]|[23][0-9]|4[12]|[5-9][0-9]) => (?<mois>0[0-9]|1[012]|[23][0-9]|4[012]|[5-9][0-9])
    Merci

  17. #17
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Je n'ai jamais fait de php pour le moment. Je comprends la logique du code de squallynou mais quand je le lance avec wamp, il m'affiche une page blanche.

    Pouvez-vous me dire s'il y a quelque chose d'autre à faire s'il vous plait ?

    Merci

    Mélanie

  18. #18
    Candidat au Club
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Je pense avoir développé une expression régulière qui intègre toutes les règles énoncées dans http://fr.wikipedia.org/wiki/Numéro_...hiffres_du_NIR :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^([1-3])[\s\.\-]?([0-9]{2})[\s\.\-]?(0[0-9]|[2-35-9][0-9]|[14][0-2])[\s\.\-]?(0[1-9]|[1-8][0-9]|9[0-57-9]|2[ab])[\s\.\-]?(00[1-9]|0[1-9][0-9]|[1-8][0-9]{2}|9[0-8][0-9]|990)[\s\.\-]?([0-9]{3})[\s\.\-]?([0-8][0-9]|9[0-7])$/gi
    Cette expression accepte les séparateurs optionnels suivants entre les parties du numéro : espace (" "), point (".") et tiret ("-").

    Pour l'instant aucun problème avec cette expression régulière.

  19. #19
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 3
    Points : 8
    Points
    8
    Par défaut
    Corrige moi si je me trompe gabsofware, mais ta regex ne gère pas le cas des personnes nées dans les DOM/TOM. Je me suis toutefois basé sur ta regex pour en réécrire une qui me semble plus complète et qui gère les départements et ordre de naissance dans les 3 cas possible :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    function valideNir($nir){
     
            /*
            #####################################################################################################################
            # Par GV le 21 / 01 / 2014. Dans la REGEX, chaque ligne représente un groupe de règles ci-dessous.                  #
            #####################################################################################################################
            # Position 1 : 1 pour un homme, 2 pour une femme, 3 pour pour les personnes étrangère en cours d'imatriculation,    #
            # 7 et 8 pour les numéros provisoir                                                                                 #
            #####################################################################################################################
            # Position 2 et 3 : Les deux derniers chiffres de l'année de naissance, de 00 à 99                                  #
            #####################################################################################################################
            # Position 4 et 5 : Mois de naissance, de 01 (janvier) à 12 (décembre), de 20 à 30 et de 50 à 99 pour les           #
            # personnes dont la pièce d'état civil ne précise pas le mois de naissance, de 31 à 42 pour celle dont la pièce     #                
            # d'état civile est incomplète mais précise quand même le mois de naissance                                         #
            #####################################################################################################################
            # Position 6 à 10 : Trois cas de figures                                                                            #
            # CAS 1 :                                                                                                           # 
            # Position 6 et 7 : Département de naissance métropolitain, de 01 à 95 (plus 2A ou 2B pour la Corse)                #
            # Dans des cas exceptionnels, il est possible de trouver le numéro 96 qui correspondais à la Tunisie avant 1956.    #
            # Position 8, 9 et 10 : Numéro d'ordre de naissance dans le département, de 001 à 989 ou 990                        #
            # CAS 2 :                                                                                                           #
            # Position 6, 7 et 8 : Département de naissance Outre-mer, de 970 à 989                                             #
            # Position 9 et 10 : Numéro d'odre de naissance dans le département, de 01 à 89, ou 90                              #
            # CAS 3 :                                                                                                           #
            # Position 6 et 7 : Naissance hors de France, une seule valeur : 99                                                 #
            # Position 8, 9 et 10 : Identifiant du pays de naissance, de 001 à 989, ou 990                                      #
            #####################################################################################################################
            # Position 11, 12 et 13 : Numéro d'ordre de l'acte de naissance dans le mois et la commune (ou pays) de 001 à 999   #
            #####################################################################################################################
            # Position 14 et 15 : Clé de contrôle, de 01 à 97 (Non cotrôlé dans ce cas)                                         #
            #####################################################################################################################
            */
     
            $regexp = "/^
            ([1-37-8])
            ([0-9]{2})
            (0[0-9]|[2-35-9][0-9]|[14][0-2])
            ((0[1-9]|[1-8][0-9]|9[0-69]|2[abAB])(00[1-9]|0[1-9][0-9]|[1-8][0-9]{2}|9[0-8][0-9]|990)|(9[78][0-9])(0[1-9]|[1-8][0-9]|90))
            ([0-9]{3})
            ?([0-8][0-9]|9[0-7])
            /x";        
     
            return preg_match($regexp, $nir, $match);
     
        }
    Si sa peut servir à quelqu'un ;-)

  20. #20
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2016
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    J'ai repris le code de snabow en y apportant quelques corrections supplémentaires :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    function valideNir($nir){
     
            /*
             * ####################################################################################################################
             * Par GV le 21 / 01 / 2014. Dans la REGEX, chaque ligne représente un groupe de règles ci-dessous.
             * ####################################################################################################################
             * Position 1 : 1 pour un homme, 2 pour une femme, 3 pour les personnes étrangères en cours d’immatriculation,
             * 7 et 8 pour les numéros provisoires
             * ####################################################################################################################
             * Position 2 et 3 : Les deux derniers chiffres de l'année de naissance, de 00 à 99
             * ####################################################################################################################
             * Position 4 et 5 : Mois de naissance, de 01 (janvier) à 12 (décembre), de 20 à 30 et de 50 à 99 pour les
             * personnes dont la pièce d'état civil ne précise pas le mois de naissance, de 31 à 42 pour celle dont la pièce
             * d'état civile est incomplète mais précise quand même le mois de naissance
             * ####################################################################################################################
             * Position 6 à 10 : Trois cas de figures
             * CAS 1 :
             * Position 6 et 7 : Département de naissance métropolitain, de 01 à 95 (plus 2A ou 2B pour la Corse)
             * Dans des cas exceptionnels, il est possible de trouver le numéro 96 qui correspondait à la Tunisie avant 1956.
             * Position 8, 9 et 10 : Numéro d'ordre de naissance dans le département, de 001 à 989 ou 990
             * CAS 2 :
             * Position 6, 7 et 8 : Département de naissance Outre-mer, de 970 à 989
             * Position 9 et 10 : Numéro d'ordre de naissance dans le département, de 01 à 89, ou 90
             * CAS 3 :
             * Position 6 et 7 : Naissance hors de France, une seule valeur : 99
             * Position 8, 9 et 10 : Identifiant du pays de naissance, de 001 à 989, ou 990
             * ####################################################################################################################
             * Position 11, 12 et 13 : Numéro d'ordre de l'acte de naissance dans le mois et la commune (ou pays) de 001 à 999
             * ####################################################################################################################
             * Position 14 et 15 : Clé de contrôle, de 01 à 97 (Non contrôlé dans ce cas)
             * ####################################################################################################################
             */
            $regexp = '/^
            ([1-37-8])
            ([0-9]{2})
            (0[0-9]|[2-35-9][0-9]|[14][0-2])
            ((0[1-9]|[1-8][0-9]|9[0-69]|2[abAB])(00[1-9]|0[1-9][0-9]|[1-8][0-9]{2}|9[0-8][0-9]|990)|(9[78][0-9])(0[1-9]|[1-8][0-9]|90))
            (00[1-9]|0[1-9][0-9]|[1-9][0-9]{2})
            (0[1-9]|[1-8][0-9]|9[0-7])
            $/x';
     
            return preg_match($regexp, $nir) > 0;
     
    }
    Pareil, si ça peut servir à quelqu'un

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

Discussions similaires

  1. [XL-2007] Age / numéro de sécurité sociale
    Par mich2p1 dans le forum Excel
    Réponses: 2
    Dernier message: 09/09/2011, 10h46
  2. [MCD] système d'information d'une caisse de sécurité sociale
    Par poulet972 dans le forum Schéma
    Réponses: 21
    Dernier message: 26/05/2010, 11h24
  3. Regexp de vérification des numéro saisis
    Par moukit233 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/01/2010, 10h37
  4. Format spécial pour le champs numéro de sécurité sociale ?
    Par Boubas1 dans le forum Modélisation
    Réponses: 1
    Dernier message: 12/05/2007, 06h19
  5. Réponses: 1
    Dernier message: 26/04/2007, 20h01

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