Php 将地址分解为数组

Php 将地址分解为数组,php,regex,Php,Regex,我有一个需要分解成数组的地址列表 所以我开始考虑使用explode将每一行分割成一个数组。这在这样的地址上很好: 阿德维尔-牛津郡51.68N 01.00W SU6999 但如果我有这样的地址: Afan-卡斯泰尔·内德·福特·塔尔博特(塔尔博特港下)51.63N 03.74W SS794938 这会引起问题 我一直在尝试玩preg_match,但无法得到一个有效的表达,因此我最终得到: 0=>Adwell 1=>Oxfordshire 2=>51.68N 3=>01.00W 4=>SU6999

我有一个需要分解成数组的地址列表

所以我开始考虑使用explode将每一行分割成一个数组。这在这样的地址上很好:

阿德维尔-牛津郡51.68N 01.00W SU6999

但如果我有这样的地址:

Afan-卡斯泰尔·内德·福特·塔尔博特(塔尔博特港下)51.63N 03.74W SS794938

这会引起问题

我一直在尝试玩preg_match,但无法得到一个有效的表达,因此我最终得到:

0=>Adwell 1=>Oxfordshire 2=>51.68N 3=>01.00W 4=>SU6999

第二个地址的输出应为

0=>Afan 1=>Castell nedd Phort Talbot(塔尔博特港下)2=>51.63N 3=>03.74W 4=>SS794938


有人认为用正则表达式可以实现这一点吗?

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

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


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

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

可能是最灵活的。我已将大多数空白设置为可选,除了您看到的\s+,因为它使用它作为一种分隔符来释放文本


可能是最灵活的。我将大部分空白设置为可选,除了您看到的\s+,因为它使用它作为一种分隔符来释放文本

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

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

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

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

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

<?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);
?>
  • 使用
    '-'
    作为分隔符,拆分为两个组件。第一部分可以保持原样,其余部分需要进一步处理
  • 从其余部分中,取最后3个空格分隔的部分,并保持其余部分不变
所以试试这个:

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

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

我已经在地址解析等方面工作了相当长的一段时间,不幸的是,没有解决方案覆盖您的所有基础。因此,您需要确定的是所有地址中的共同点。对我来说,这似乎是右边的东西。所以我会先把它们解析出来。看起来你可以按空间爆炸并抓取最后3项(pop x 3或slice works)。然后重新组合(join)并将其正则化

<?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);
?>
/([a-z]+)\s-\s([a-z\-)\s\(\)]+)/i
这将为您提供两批字符串。一个是第一个东西,第二个是剩下的东西。然后,您需要检查括号中是否有任何内容,并相应地解析这些内容

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


祝你好运

我从事地址解析和类似的工作已经有相当一段时间了,不幸的是,没有一个解决方案可以覆盖所有的基础。因此,您需要确定的是所有地址中的共同点。对我来说,这似乎是右边的东西。所以我会先把它们解析出来。看起来你可以按空间爆炸并抓取最后3项(pop x 3或slice works)。然后重新组合(join)并将其正则化

/([a-z]+)\s-\s([a-z\-)\s\(\)]+)/i
这将为您提供两批字符串。一个是第一个东西,第二个是剩下的东西。然后,您需要检查括号中是否有任何内容,并相应地解析这些内容

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


祝你好运

这对第一个可能有效,但我认为第二个例子会失败得很惨。虽然没有看到第二种情况下的期望输出,但很难说清楚。第二种情况下的期望输出是:0=>Afan 1=>Castell nedd Phort Talbot(Neath Port Talbot)2=>51.63N 3=>03.74W 4=>SS794938取决于其他地址。这种方法并不坏——你们可以从结果数组中获取前2项和后3项。这段代码用空格分隔。第一个和最后三个元素是固定的,第二个元素可以扔掉,其余的中间元素可以组合起来得到所需的输出。@watcher第二种情况下所需的输出是什么?这对第一种情况有效,但我认为第二种情况下失败得很惨。虽然没有看到第二种情况下的期望输出,但很难说清楚。第二种情况下的期望输出是:0=>Afan 1=>Castell nedd Phort Talbot(Neath Port Talbot)2=>51.63N 3=>03.74W 4=>SS794938取决于其他地址。这种方法并不坏——你们可以从结果数组中获取前2项和后3项。这段代码用空格分隔。前三个元素和后三个元素是固定的,第二个元素可以扔掉,其余的中间元素可以组合起来得到所需的输出。@watcher所需的是什么