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 :

Format adresse française via regex


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 29
    Points : 14
    Points
    14
    Par défaut Format adresse française via regex
    Bonjour à tous,

    J'ai besoin d'un coup de main pour formater une adresse via expression regex respectant un certain nombre de critères.

    //exemples :
    130 Bis av de l'ecole d'ici
    doit me retourner
    130 bis, avenue de l'Ecole d'Ici

    rue de l'adjudant du 3e RI
    doit me retourner
    Rue de l'Adjudant Machin du 3e RI

    54 chemin des beaux jours
    doit me retourner
    54, chemin des Beaux Jours

    //

    Je me suis un peu cassé la tête sur l'apostrophe et notamment sur la lettre qui précède (d', l'), que je ne veux pas en majuscule.
    De même, le numéro de la rue n'étant pas obligatoire, et le bis non plus, j'aimerais que le contrôle n'opère que si la chaine commence par x chiffres, suivis de Bis ou Ter ou Quat.
    J'ai liste tous les "rue | impasse | avenue | sente | square | esplanade..etc" que je veux en minuscules.

    Si quelqu'un peut m'aider, merci d'avance !

  2. #2
    Membre habitué Avatar de denissay
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 103
    Points : 125
    Points
    125
    Par défaut
    Qu'avez-vous essayé ? Qu'est-ce qui ne fonctionne pas ?
    Une réponse utile vous a aidé ? N'oubliez pas le
    Votre problème est résolu ? N'oubliez pas le

  3. #3
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    J'ai tenté différentes choses comme [0-9]{,3}?[,]?[bis|ter|quat]?[0-9a-zA-Z-à-ÿ\s\'] mais je sens que je n'y suis pas.

  4. #4
    Membre habitué Avatar de denissay
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 103
    Points : 125
    Points
    125
    Par défaut
    Bon, ton avant dernier paragraphe n'est pas assez clair... Pour te lancer, tu peux essayer le pattern suivant (Pour toute entrée commençant par un chiffre suivi d'un mot de la liste, récupérer tous les mots suivants séparés d'un espace):
    (?:\d{0,3} +(bis|ter|quat)|\G(?<!^)) (\S+)
    DEMO

    Et regarde aussi l'usage avec preg_replace_callback
    Une réponse utile vous a aidé ? N'oubliez pas le
    Votre problème est résolu ? N'oubliez pas le

  5. #5
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    Merci de t'être penché sur la question.
    Je vais regarder en détail ton motif car j'avoue qu'à première vue, toutes les subtilités ne me sautent pas aux yeux...

    Si je comprends, il me manque notamment une recherche sur l'apostrophe pour séparer en deux mots le "l'" de "école".

    Je poursuis...

  6. #6
    Membre habitué Avatar de denissay
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 103
    Points : 125
    Points
    125
    Par défaut
    Tu peux voir ce pattern amélioré qui match:
    • un string commençant par des chiffres;
    • suivis d'un des mots de la liste;
    • puis suivis par tous les autres mots (incluant les lettres accentués) séparés par des espaces "\s" ou des caractères de ponctuation "\p{P}".


    (?:^\s*\d{0,3} +(bis|ter|quat)|\G(?<!^))[\s\p{P}]+(\p{Latin}+)
    DEMO

    et donc c'est à l'interieur de ta fonction de preg_replace_callback que tu filtreras et tu définiras tes régles de remplacement (par exemple, ignorer les lettres individuelles, mettre en majuscules les mots de plus de x lettres, ...)
    Une réponse utile vous a aidé ? N'oubliez pas le
    Votre problème est résolu ? N'oubliez pas le

  7. #7
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    Merci Denissay pour ces précisions.
    Je suis en train de lire et relire les bases car j'ai du mal à m'en sortir.

    Sur le motif que tu donnes, pourquoi intégrer (\p{Latin} ? En remplacement de ce que j'avais mis sous la forme "à-ÿ" ?

  8. #8
    Membre habitué Avatar de denissay
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 103
    Points : 125
    Points
    125
    Par défaut
    \p{Latin} comprend toutes les lettres y comris toutes les lettres accentués, mais tu peux bien préciser lesquels si tu veux comme t'as déjà fait...
    Une réponse utile vous a aidé ? N'oubliez pas le
    Votre problème est résolu ? N'oubliez pas le

  9. #9
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    Désolé pour cette réponse tardive et merci pour cette précision.

    Après avoir retourné mes problèmes dans tous les sens, et grâce à ton aide, je suis arrivé à une solution qui fonctionne presque, bien que ce soit probablement, j'en conviens, une usine à gaz.
    Voici mon code javascript :
    Code javascript : 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
     
    function upperfirst(champ)
    {
      var val = champ.value.toLowerCase();
      var virgule = ", ";
      var espace = " ";
     
    var regex = /(\d+)?\,?\s?(bis|ter|quater)?\,?\s?(rue|avenue|boulevard|r|av|ave|bd|bvd|square|sente|impasse|cours|esplanade|allée|résidence|parc|rond-point|chemin|côte|place|cité|quai|passage|lôtissement|hameau)?\s([a-zA-Zà-ÿ0-9\s]{2,})+$/gi;
    match = regex.exec(val);
     
    // on remplace les abréviations éventuelles
    switch (match[3]){
    		case "r": match[3]="rue"; break;
    		case "bd": match[3]="boulevard"; break;
    		case "bvd": match[3]="boulevard"; break;
    		case "av": match[3]="avenue"; break;
    		case "ave": match[3]="avenue"; break;
    		case "sq": match[3]="square"; break;
    		case "imp": match[3]="impasse"; break;
    		case "esp": match[3]="esplanade"; break;
    		case "all": match[3]="allée"; break;
    		case "rés": match[3]="résidence"; break;
    		case "res": match[3]="résidence"; break;
    		case "chem": match[3]="chemin"; break;
    		case "pl": match[3]="place"; break;
    		case "pass": match[3]="passage"; break;
    		case "lot": match[3]="lôtissement"; break;
    		case "ham": match[3]="hameau"; break;
    }
     
     
    // s'il y a un numéro de rue (non obligatoire dans l'adresse)
    if (match[1]!=null && match[3]!=null && match[4]!=null)
    	{
    	// s'il y a un bis, ter ou quater
    	if (match[2]!=null)
    	{
     
    		champ.value = (match[1]+espace+match[2]+virgule+match[3]+espace+match[4]);
    		}
    	//sinon
    	else
    		{champ.value = (match[1]+virgule+match[3]+espace+match[4]);
    		}
    		}
     
    // s'il n'y a pas de numéro (et même avec un bis, ter ou quater)		
    else if (match[3]!=null && match[4]!=null)
    	{
    		champ.value = (match[3]+espace+match[4]);
    		}
     
    else{
    alert ("Merci de vérifier l'adresse que vous avez saisie...");
    }
    }


    En gros, l'adresse
    51 rue pompidou renvoie 51, rue pompidou
    51 bis rue pompidou renvoie 51 bis, rue pompidou
    51 r pompidou renvoie 51, rue pompidou
    51 bis r pompidou envoie 51 bis, rue pompidou
    51, bis r pompidou envoie 51 bis, rue pompidou

    Les problèmes qui me restent - outre l'optimisation de ce code - sont de remettre des majuscules sur toutes mes initiales de ma chaine match[4], c'est à dire les mots après le n°, le bis, et le mot rue, avenue, etc.
    J'aimerais également pouvoir exclure les mots du type "sur, sous, de, à", etc. qui n'ont pas à être en majuscule...

    J'ai tenté d'utiliser la fonction split pour récupérer les différentes parties de ma chaine afin de les mettre en majuscules, mais en vain.

Discussions similaires

  1. [RegExp] Regex de contrôle de format adresse email
    Par renaud26 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 26/03/2012, 11h03
  2. Réponses: 8
    Dernier message: 23/06/2007, 10h38
  3. Adresse IP via un fournisseur d'accès
    Par Sakalam dans le forum Administration
    Réponses: 6
    Dernier message: 11/04/2006, 13h10
  4. Format d'impression via IE
    Par fabrice.Croize dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/03/2006, 09h50
  5. Manipulation du carnet d'adresse outlook via VBA Excel?
    Par Dragon Tours dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/11/2005, 12h16

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