Découper une adresse physique grâce aux expressions régulières en PHP
Récemment, j’ai du découper une bonne liste d’adresses formatées ainsi :
12 bis rue du 18 Mai 1945, 78000 Versailles
(je ne sais même pas si cette adresses existe, c’est un exemple..)
Je souhaitais obtenir les informations suivantes :
- N° dans la voie + éventuellement la mention bis ou ter
- Nom de la voie
- Code Postal
- Ville
Au lieu de passer à la main sur la liste, j’ai codé un petit bout de PHP pour le faire à ma place ![]()
Pour cela, je me suis servi des expressions régulières grâce à la fonction preg_match();
Le code PHP :
preg_match('/^([\d\/-]+?[\h]?(bis|ter)?)[\h]*([\D]{3}.*),[\h]*([\d]{5})[\h]*(.*)$/i', $adresse, $aMatch);
$numero = $aMatch[1];
$voie = $aMatch[3];
$code_postal = $aMatch[4];
$ville = $aMatch[5];
Analyse :
Analysons cette (magnifique, avouons-le) expression régulière :
^([\d\/-]*[\h]?(bis|ter)?)[\h]*([\D]{3}.*),[\h]*([\d]{5})[\h]*(.*)$
Dans l’ordre :
- ^ : début du texte à analyser
- ([\d\/-]*[\h]?(bis|ter)?) : capture d’une série de chiffres (pouvant comprendre un -, genre 5-7 rue ….) suivi ou non d’un espace puis de la mention « bis » ou « ter » (ou pas)
- [\h]* : aucun, un ou plusieurs espaces
- ([\D]{3}.*) : 3 caractères qui ne sont pas numériques, suivi (ou non) de divers caractères (le nom de la voie)
- , : la virgule qui sépare le nom de la voie du code postal
- [\h]* : encore aucun, un ou plusieurs espaces
- ([\d]{5}) : 5 caractères numériques (le code postal)
- [\h]* : encore aucun, un ou plusieurs espaces
- (.*) : une série de n’importe quel caractère (le nom de la ville)
- $ : fin du texte à analyser
J’ai utilisé le modificateur « i » en fin d’expression régulière pour que le traitement soit insensible à la case uniquement pour « bis » et « ter »).
Cette expression fonctionne sur ces adresses :
- 12 bis rue du 18 Mai 1945, 78000 Versailles
- 5-7 avenue de Paris, 84000 Avignon
- Place d’Arme, 75001 Paris
- Certainement d’autres…
Si j’ai omis quoi que ce soit, ou que l’expression ne fonctionne pas sur certaines adresses, n’hésitez pas à me le signaler dans les commentaires, je ferai évoluer ce bout de code
Ou alors une requête à Yahoo! Placemaker, qui te découpe tout ça bien comme il faut
http://query.yahooapis.com/v1/public/yql?q=SELECT%20*%20FROM%20geo.placemaker%20WHERE%20documentContent%20%3D%20%2212%20bis%20rue%20du%2018%20Mai%201945%2C%2078000%20Versailles%22%20AND%20%20%20%20%20%20documentType%3D%22text%2Fplain%22&diagnostics=true
Effectivement
J’imagine que c’est même bien plus fiable que ma solution, et valable pour l’international ^^