| Geo-StreetAddress-FR documentation | Contained in the Geo-StreetAddress-FR distribution. |
Geo::StreetAddress::FR - Perl extension for parsing French street addresses
use Geo::StreetAddress::FR;
my $adresse = Geo::StreetAddress::FR->new;
$adresse->rue("15 grande rue");
$adresse->parse();
print $adresse->numero_voie. " " . $adresse->type_voie. " " .$adresse->nom_voie;
Geo::StreetAddress::FR is a street address parser for France.
parse a street address, returning an address element.
my $res = $adress->parse("bat C 13B route Bordeaux");
print $res->numero_voie; # will print 13
print $res->type_voie; # will print route
print $res->nom_voie; # will print Bordeaux
print $res->complement; # will print B
print $res->extension; # will print bat C
return 'undef' if $adress->message is set, or if the adress can't be parsed.
Please report any bugs or feature requests to
bug-geo-streetaddress-fr@rt.cpan.org, or through the web interface at
http://rt.cpan.org.
Ideas and part of the code are coming from this module.
franck cuny <franck.cuny@gmail.com>
Copyright (c) 2007, franck cuny <franck.cuny@gmail.com>. All rights reserved.
This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See perlartistic.
| Geo-StreetAddress-FR documentation | Contained in the Geo-StreetAddress-FR distribution. |
package Geo::StreetAddress::FR; use warnings; use strict; use Carp; use base qw(Class::Accessor::Fast); our $VERSION = '0.0.4'; __PACKAGE__->mk_accessors( qw(adresse message) ); our %extension_type_with_number = ( 'etg' => 'etage', 'et' => 'etage', 'etage' => 'etage', 'ent' => 'entree', 'entree' => 'entree', ); our %extension_type = ( 'res' => 'residence', 'resid' => 'residence', 'residence' => 'residence', 'bat' => 'batiment', 'batiment' => 'batiment', 'cour' => 'cours', 'cours' => 'cours', 'foyer' => 'foyer', 'ferme' => 'ferme', 'hlm' => 'immeuble', 'immeuble' => 'immeuble', 'immeubles' => 'immeuble', 'esc' => 'escalier', 'escalier' => 'escalier', 'porte' => 'porte', 'maison de retraite' => 'maison', 'Mais Retr' => 'maison', ); our %street_type = ( 'all' => 'allee', 'allee' => 'allee', 'allees' => 'allee', 'av' => 'avenue', 'avenue' => 'avenue', 'bd' => 'boulevard', 'bld' => 'boulevard', 'bois' => 'bois', 'boulevard' => 'boulevard', 'bourg' => 'bourg', 'cami' => 'cami', 'camp militaire' => 'militaire', 'carrefour' => 'carrefour', 'cavee' => 'cavee', 'centre commercial' => 'commerce', 'ch' => 'chateau', 'chat' => 'chateau', 'chateau' => 'chateau', 'chaussee' => 'chaussee', 'chauss' => 'chaussee', 'che' => 'chemin', 'chem' => 'chemin', 'chemin' => 'chemin', 'cht' => 'chateau', 'cite' => 'cite', 'cloitre' => 'cloitre', 'clos' => 'clos', 'domaine' => 'domaine', 'esplanade' => 'esplanade', 'faubourg' => 'faubourg', 'fbg' => 'faubourg', 'fg' => 'fg', 'gde rue' => 'rue', 'gr' => 'rue', 'grand cour' => 'cours', 'grand rue' => 'rue', 'grande route' => 'route', 'grande rue' => 'rue', 'hameau' => 'hameau', 'imp' => 'impasse', 'impasse' => 'impasse', 'jardin' => 'jardin', 'jardins' => 'jardin', 'ldt' => 'lieu', 'lieu dit' => 'lieu', 'lot' => 'lotissement', 'lotiss' => 'lotissement', 'lotissement' => 'lotissement', 'mail' => 'mail', 'marche' => 'marche', 'montee' => 'montee', 'moulin' => 'moulin', 'parc' => 'parc', 'passage' => 'passage', 'passe' => 'passee', 'pavillon' => 'pavillon', 'petite route' => 'route', 'petite rue' => 'petite rue', 'pl' => 'place', 'place' => 'place', 'placette' => 'place', 'promenade' => 'promenade', 'quai' => 'quai', 'quartier' => 'quartier', 'quart' => 'quartier', 'rampe' => 'rampe', 'rdpt' => 'rondpoint', 'rond point' => 'rondpoint', 'route' => 'route', 'rte' => 'route', 'r' => 'rue', 'rue' => 'rue', 'ruelle' => 'rue', 'rues' => 'rue', 'sen' => 'sentier', 'sente' => 'sentier', 'sentier' => 'sentier', 'squ' => 'square', 'sq' => 'square', 'square' => 'square', 'tertre' => 'tertre', 'tour' => 'tour', 'traverse' => 'traverse', 'venelle' => 'venelle', 'vieille route' => 'route', 'villa' => 'village', 'village' => 'village', 'voie' => 'voie', 'zi' => 'zi', 'zone artisanale' => 'za', 'zone industrielle' => 'zi', ); our %_Street_Type_List = map { $_ => 1 } %street_type; our %_Extension_Type_List = map { $_ => 1 } %extension_type; our %_Extension_Type_Number_List = map { $_ => 1 } %extension_type_with_number; my @comp = ( 'a' .. 'z' ); push @comp, 'bis', 'ter', 'quater', 'quinque', 'quinquies'; our %Addr_Match = ( type => join( "|", keys %_Street_Type_List ), extension => join( "|", keys %_Extension_Type_List ), extension_number => join( "|", keys %_Extension_Type_Number_List ), complement => join( "|", @comp ), ); { use re 'eval'; $Addr_Match{ adresse } = qr/ (?: ([\d]+)(($Addr_Match{complement})?) (?{ $_{numero_voie} = $1; $_{complement} = $2 }) \s($Addr_Match{type}) (?{ $_{type_voie} = $^N }) (?: \s(.*)\s(($Addr_Match{extension}).*) (?{$_{nom_voie} = $5; $_{extension} = $^N}) | \s(.*) (?{ $_{nom_voie} = $^N }) | \s(.*)\s(($Addr_Match{type}).*) (?{$_{nom_voie} = $5; $_{extension} = $^N}) ) ) | (?: ($Addr_Match{type})\b (?{ $_{type_voie} = $^N }) \s(.*) (?{ $_{nom_voie} = $^N }) ) | (?: (($Addr_Match{extension}|$Addr_Match{extension_number}).*) (?{$_{extension} = $^N}) (?: \s(([\d]+)?) (?{ $_{numero_voie} = $^N}) (($Addr_Match{complement})?) (?{ $_{complement} = $^N}) \s($Addr_Match{type})\b (?{ $_{type_voie} = $^N }) \s(.*) (?{ $_{nom_voie} = $^N }) | \s($Addr_Match{extension})\b (?{ $_{type_voie} = $^N }) \s(.*) (?{ $_{nom_voie} = $^N }) ) ) /ix; } # warn $Addr_Match{adresse};
sub parse { my $self = shift; local %_; $self->_adress_missing(); return undef if defined $self->message(); if ( $self->adresse =~ /$Addr_Match{adresse}/ios ) { my %part = %_; my $adresse = Geo::StreetAddress::FR::Element->new; $adresse->nom_voie( $part{ 'nom_voie' } ); $adresse->numero_voie( $part{ 'numero_voie' } ); $adresse->type_voie( $part{ 'type_voie' } ); $adresse->complement( $part{ 'complement' } ); $adresse->extension( $part{ 'extension' } ); return $adresse; } return undef; } sub _adress_missing { my $self = shift; $self->message( undef ); return if defined $self->adresse; $self->message( "You have to set an adress : \$mystreetobject->adresse(\"name of my adress\")" ); } 1; package Geo::StreetAddress::FR::Element; use base qw(Class::Accessor::Fast); __PACKAGE__->mk_accessors( qw(rue type_voie nom_voie complement numero_voie extension) ); 1; __END__