拆分地址街道名称门牌号和房间号

Split address street name house number and room number

我需要拆分地址:Main Str. 202-52 street=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']);但只得到街道名称...

您可以使用像

这样的正则表达式
/^(.*)\s(\d+)\W+(\d+)$/

如果您需要所有直到最后一个空格进入第 1 组,接下来的数字进入第 2 组,最后一个数字进入第 3 组。\W+ 匹配 1+ 个字符而不是单词字符,所以它匹配 - 等等。如果那里有 -,只需使用连字符而不是 \W+

参见 regex demo and a PHP 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+ non-word 个字符
  • (\d+) - 第 3 组:一个或多个数字
  • $ - 字符串结尾。

此外,请注意,如果最后一部分是可选的,请将 \W+(\d+) 包裹在可选的捕获组中(即 (?:...)?(?:\W+(\d+))?)。