将地址分解为数组

时间:2012-05-16 13:42:56

标签: php regex

我有一个需要细分为数组的地址列表。

所以我开始考虑使用explode将每一行分成一个数组。哪个可以在这样的地址上正常工作:

  

Adwell - Oxfordshire 51.68N 01.00W SU6999

但如果我有这样的地址:

  

Afan - Castell-nedd Phort Talbot(Neath Port Talbot)51.63N 03.74W   SS794938

这会导致问题。

我一直在尝试使用preg_match但是无法使表达式工作以便我最终得到:

  

0 => Adwell 1 =>牛津郡2 => 51.68N 3 => 01.00W 4 => SU6999

第二个地址的输出应为

  

0 => Afan 1 => Castell-nedd Phort Talbot(Neath Port Talbot)2 => 51.63N 3 => 03.74W 4 => SS794938

有没有人看到用正则表达式实现这一目标的好方法?

5 个答案:

答案 0 :(得分:2)

<?php
// Solution.
function parseAddress($address)
{
    $matches = NULL; 
    preg_match('/([^-]*) - ([^\d]*) (\d\d\.\d\dN) (\d\d\.\d\dW) (.*)/',
               $address, $matches);
    return array_slice($matches, 1);
}

// Test case 1.
$parsed = parseAddress('Adwell - Oxfordshire 51.68N 01.00W SU6999');
var_dump($parsed);

// Test case 2.
$parsed = parseAddress('Afan - Castell-nedd Phort Talbot (Neath Port Talbot) ' .
                       '51.63N 03.74W SS794938');
var_dump($parsed);
?>

输出:

array(5) {
  [0]=>
  string(6) "Adwell"
  [1]=>
  string(11) "Oxfordshire"
  [2]=>
  string(6) "51.68N"
  [3]=>
  string(6) "01.00W"
  [4]=>
  string(6) "SU6999"
}
array(5) {
  [0]=>
  string(4) "Afan"
  [1]=>
  string(45) "Castell-nedd Phort Talbot (Neath Port Talbot)"
  [2]=>
  string(6) "51.63N"
  [3]=>
  string(6) "03.74W"
  [4]=>
  string(8) "SS794938"
}

答案 1 :(得分:1)

我认为你不需要正则表达式。只需简单的爆炸就足够了。

explode(' ', "Adwell - Oxfordshire 51.68N 01.00W SU6999")

更多advance way

$str = "Afan - Castell-nedd Phort Talbot (Neath Port Talbot) 51.63N 03.74W SS794938";
$parts = array_filter(explode(' ', $str));
$ss = array_pop($parts);
$w = array_pop($parts);
$n = array_pop($parts);
$name = array_shift($parts);
$hash = array_shift($parts);
$result = array($name, implode($parts, ' '), $n, $w, $ss);
print_r($result);

答案 2 :(得分:1)

您需要更好地消除语法歧义。从这两个例子中,我的猜测是以下应该有效:

  • 分为两个组件,使用' - '作为分隔符。第一个组件可以保持原样,其余组件需要进一步处理。
  • 从其余部分开始,取最后3个以空格分隔的部分,并保持原样。

所以试试这个:

/^(.*?)\s-\s(.*)\s+(\S+)\s+(\S+)\s+(\S+)$/

如果没有对预期输入格式的更正式的描述,没有人能够给你一个决定性的答案。

答案 3 :(得分:0)

(.*)\s+-\s*(.*)\s+(\d+\.\d+N)\s*(\d+\.\d+W)\s*(SS\d+)

可能是最灵活的。香港专业教育学院大部分的空白是可选的,除了你看到的地方\ s +,因为它使用它作为一种自由文本的分隔符

答案 4 :(得分:0)

我一直致力于地址解析等等很长一段时间,遗憾的是没有解决方案可以涵盖你的所有基础。所以你需要确定的是所有地址中的共同点。对我来说,这似乎是右边的东西。所以我先解析那些。好像你可以通过空间爆炸并抓住最后3个项目(pop x 3或slice工作)。然后重新组合(加入)和正则表达式。

/([a-z]+)\s-\s([a-z\-)\s\(\)]+)/i

这会给你两批字符串。一个是第一个东西,第二个是剩下的东西。然后,您需要检查括号中是否有任何内容并相应地解析这些内容。

遗憾的是,我并不完全熟悉您的地址格式,因为我主要处理基于美国的地址字符串/块。但是,在从末尾删除公共项目后,剩余的字符串应该可以轻松识别城市/州/省的部分。无论哪种方式,您都需要一套正则表达式和逻辑,以确保最终结果尽可能准确。基本上,您可以根据数据的格式设计数据的路径。

祝你好运!