Regex adresini ayrıştırmak

4 Cevap php

I have to create a loop, and with a regexp populate any of the 4 variables

$address, $street, $town, $lot

The loop will be fed a string that may have info in it like the lines below

  • '123 any street, mytown' veya
  • 'Lot 4 another road, thattown' veya
  • 'Lot 2 96 other road, her town' veya
  • 'this ave, this town' veya
  • 'yourtown'

virgülden sonra bir şey $town düşündüm beri

(.*), (.*)

then the first capture could be checked with (Lot \d*) (.*), (.*) if the 1st capture starts with a number, then its the address (if word with white space its $street) if one word, its just the $town

4 Cevap

ABD'nin bu adresler ise Geo::StreetAddress::US bir göz atın.

Değillerse bile, bu modülün kaynak size ücretsiz form sokak adresleri ayrıştırma dahil ne bir fikir vermelidir.

Burada yayınlanan adreslerini işleyen bir betik (updated, önceki sürüm bir dizeye kombine lot ve numarası):

#!/usr/bin/perl

use strict; use warnings;

local $/ = "";

my @addresses;

while ( my $address = <DATA> ) {
    chomp $address;
    $address =~ s/\s+/ /g;
    my (%address, $rest);
    ($address{town}, $rest) = map { scalar reverse }
                        split( / ?, ?/, reverse($address), 2 );

    {
        no warnings 'uninitialized';
        @address{qw(lot number street)} =
            $rest =~ /^(?:(Lot [0-9]) )?(?:([0-9]+) )?(.+)\z/;
    }
    push @addresses, \%address;
}

use Data::Dumper;
print Dumper \@addresses;

__DATA__
123 any street,
mytown

Lot 4 another road,
thattown

Lot 2 96 other road,
her town

yourtown

street,
town

Çıktı:

$VAR1 = [
          {
            'lot' => undef,
            'number' => '123',
            'street' => 'any street',
            'town' => 'mytown'
          },
          {
            'lot' => 'Lot 4',
            'number' => undef,
            'street' => 'another road',
            'town' => 'thattown'
          },
          {
            'lot' => 'Lot 2',
            'number' => '96',
            'street' => 'other road',
            'town' => 'her town'
          },
          {
            'lot' => undef,
            'number' => undef,
            'street' => undef,
            'town' => 'yourtown'
          },
          {
            'lot' => undef,
            'number' => undef,
            'street' => 'street',
            'town' => 'town'
          }
        ];

Ben onun doğruluğunu kontrol etmek zor olacak gibi tek bir regexp tüm bu yapmaya kalkmayın öneririm.

Birincisi, ben virgül bölmek istiyorum. Ne olursa olsun virgülden sonra gelen $ şehridir ve hiçbir virgül varsa, bütün dize $ şehridir.

Sonra herhangi bir şey bir bilgi olup olmadığını kontrol edin ve dize ayıklamak istiyorum.

Sonra sokak / cadde numarası ve adı için bakmak istiyorum.

Böl ve yönet :)

Bu 3 bölüme ayırmak gerekir - nasıl adres / sokak ayırt edebiliriz?

(Lot \d*)? ?([^,]*,)? ?(.*)

Burada örnekler için arıza

('', '123 any street,', 'mytown')
('Lot 4', 'another road,', 'thattown')
('Lot 2', '96 other road,', 'her town')
('', 'this ave,', 'this town')
('', '', 'yourtown')

Eğer doğru anlamak, bu bir de adres / sokak ayırır

(Lot \d*)? ?(\d*) ?([^,]*,)? ?(.*)

('', '123', 'any street,', 'mytown')
('Lot 4', '', 'another road,', 'thattown')
('Lot 2', '96', 'other road,', 'her town')
('', '', 'this ave,', 'this town')
('', '', '', 'yourtown')

Ben son bir maç olamaz ama ilk 3 olanlar için bu gibi bir şey kullanabilirsiniz:

if (preg_match('/(?:Lot (\d*)|)(?: |)(?:(\d*)|) (.*), (.*)/m', $subject, $regs)) {
    $result = $regs[1];
} else {
    $result = "";
}

Bu test düzenli ifade olduğu:

(?:Lot (\d*)|)(?: |)(?:(\d*)|) (.*), (.*)

Sen testine RegexBuddy kullanabilirsiniz: link