我有一个需要细分为数组的地址列表。
所以我开始考虑使用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
有没有人看到用正则表达式实现这一目标的好方法?
答案 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)
您需要更好地消除语法歧义。从这两个例子中,我的猜测是以下应该有效:
' - '
作为分隔符。第一个组件可以保持原样,其余组件需要进一步处理。所以试试这个:
/^(.*?)\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
这会给你两批字符串。一个是第一个东西,第二个是剩下的东西。然后,您需要检查括号中是否有任何内容并相应地解析这些内容。
遗憾的是,我并不完全熟悉您的地址格式,因为我主要处理基于美国的地址字符串/块。但是,在从末尾删除公共项目后,剩余的字符串应该可以轻松识别城市/州/省的部分。无论哪种方式,您都需要一套正则表达式和逻辑,以确保最终结果尽可能准确。基本上,您可以根据数据的格式设计数据的路径。
祝你好运!