2017-02-10 226 views
1

我需要拆分地址:Main Str. 202-52street=Main Str. house No.=202 room No.=52 我试图用这样的:拆分地址街道名称门牌号码和房号

$data['address'] = "Main Str. 202-52"; 
$data['street'] = explode(" ", $data['address']); 
$data['building'] = explode("-", $data['street'][0]); 

它工作时,街道名一个字。如何拆分街道名称有几个词的地址。 我试图$data['street'] = preg_split('/[0-9]/', $data['address']);但只得到街道名称...

回答

1

您可以使用正则表达式像

/^(.*)\s(\d+)\W+(\d+)$/ 

如果你需要的一切,直至最后变成空白1组,下位到第2组和到组3的最后数字。\W+匹配除字词之外的1+个字符,因此它匹配-以及更多。如果您有-那里,只需使用连字符而不是\W+

regex demoPHP demo

$s = "Main Str. 202-52"; 
if (preg_match('~^(.*)\s(\d+)\W+(\d+)$~', $s, $m)) { 
    echo $m[1] . "\n"; // Main Str. 
    echo $m[2] . "\n"; // 202 
    echo $m[3];  // 52 
} 

模式的细节:

  • ^ - 字符串的开始
  • (.*) - 第1组捕获比换行字符其他任何字符0+尽可能地多到最后....
  • \s - 空白,接着与...
  • (\d+) - 组2:一个或多个数字
  • \W+ - 1+非字字符
  • (\d+) - 第3组:一个或多个数字
  • $ - 端字符串。

而且,注意,在的情况下的最后部分可以是任选的,带有可选的捕获组包裹\W+(\d+)(即(?:...)?(?:\W+(\d+))?)。

+0

@ WiktorStribiżew...你是天才。谢谢。是的正则表达式很好的决定。 –

+0

我现在没有错误地编辑正则表达式到''/ ^(。*)\ s(\ d +)(?:\ W +(\ d +))?$ /''...我需要使用您的可选建议。 –