2013-07-01 56 views
1

我有一些我需要处理的会计系统字符串。会计系统只允许在一个input字段中输入邮政编码和城市。数据稍后通过xml输出并导入php系统。如何解析这些字符串?

我正在寻找一种方法来提取从城市的邮政编码,但这些都在不同的格式,因此一个简单的substr();不工作

我需要处理的值的一些例子是:

1234 ZC ALPHEN AAN DEN RIJN 
1234SG UTRECHT 
33602 BIELEFELD 
W7 3QB LONDON 

如何从城市中为每个城市拆分邮政编码?我已经联系了会计系统的制造商,他们了解我的问题,并将考虑将未来呼叫分成两部分,但这需要一些时间。

+0

你在哪个国家获得邮政编码?英国/美国? –

+0

是第一个邮政编码“1234 ZC”还是“1234”?我问的原因是因为很难告诉计算机在人类破译时很难做什么。 –

+0

我同意,它会持续很长时间。我怀疑在这里转换错误的容忍度是0,所以唯一的办法就是手动。我猜测邮政编码,短划线,字母和数字在各种可能的组合中混合在一起的空间。好家伙。 – Sharky

回答

2

这不符合Google的条款和条件,除非您将这些数据存储在谷歌地图上,但利用它们的权力是非常诱人的,因为它们只是在这个东西。

地理编码API将能够处理几乎任何地址/邮政编码组合和变体,您可以使用它们 - 无论是否包含空格,邮编首先或最后等等,包括不同的地名(“伦敦” ,“Londres”)。

的请求

http://maps.googleapis.com/maps/api/geocode/json?address=2408%20ZC%20ALPHEN%20AAN%20DEN%20RIJN&sensor=false 

返回JSON流含有,除其他事项:

"address_components" : [ 
     { 
      "long_name" : "2408 ZB", 
      "short_name" : "2408 ZB", 
      "types" : [ "postal_code" ] 
     }, 
     { 
      "long_name" : "Alphen aan den Rijn", 
      "short_name" : "Alphen aan den Rijn", 
      "types" : [ "locality", "political" ] 
     }, 
... 

This页概述了使用该服务的要求和限制。

请注意,如果数据稍有不妥,Google API会猜测这些内容。您最初的1234 ZC示例不正确,并且API会插入,以尝试为您提供一些您需要处理的内容。请确保您了解API对不正确数据的反应,并且小心不要让自己在结果中自己拍摄。

+0

这很好,但如果对错误的容忍度为0,则此转换的结果必须由人类审核和验证。 – Sharky

+0

@Sharky当然。从经验来看,只要传入的数据很好,至少在西欧和美国,我认为它非常可靠。如果数据包含一个小错误,它可能会稍微偏离,然后API将开始插值,有时会出现奇怪的结果。 –

+0

是的,它是非常可靠的,但传入的数据将不会“好”。我在用户数据输入方面做了很多工作。这是疯狂。用户无法连续两次正确输入其名称。组合框在任何适用的地方都可以实现救生。 – Sharky

0

如果您在当时知道国家/地区,试图将邮政编码从城市中拆分出来,则可以使用它查找与正确解析方式相对应的正则表达式(或类似的数据)邮政编码。

例如,你可能会在一个阵图国家正则表达式(这些正则表达式都只是样品 - 不严格测试):

$regexMap = array(
    'US' => '(\d{5}|\d{5}-\d{4}|\d{9})\s+(.*)', 
    'UK' => '([\d\w]{2,4}\s+\d\w{2})\s+(.*)', 
    ... 
); 

$regularExpression = $regexMap[$country]; 
preg_match($regularExpression, $incomingPostalCodeAndCity, $postalData); 
$postalCode = $postalData[0]; 
$city = $postalData[1]; 

虽然你也许可以结合正则表达式的一些(很多?)各国邮政编码差异很大,您可能仍然需要一个相当长的正则表。

每个正则表达式都应该被设计为返回邮政编码作为第一个子模式和城市作为第二个子模式。

这个问题的答案中有一些相关的信息:What is the ultimate postal code and zip regex?(包括一些不同国家的邮政编码正则表达式的列表)。