2013-07-01 4 views
1

У меня есть некоторые строки из нашей системы учета, которые мне нужно обработать. Система учета дает только возможность ввести почтовый индекс и город в поле input. Данные позже экспортируются через xml и импортируются в систему php.Как разобрать эти строки?

Я ищу способ извлечь почтовый индекс от города, однако они приходят в различных форматах, так что простой substr(); не работает

Некоторые примеры значений, мне нужно обрабатывать являются:

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

Как расколоть почтовый индекс из города для каждого из них? Я уже связался с производителем системы учета, и они поняли мою проблему и рассмотрят разделение значений в 2 для будущих вызовов, но это займет некоторое время.

+0

В какой стране вы получаете почтовые индексы? Великобритания/США? –

+0

Является первым почтовым индексом "1234 ZC" или "1234"? Причина, по которой я спрашиваю, заключается в том, что сложно сказать компьютеру, что делать, когда людям даже сложно расшифровать. –

+0

Я согласен, он продлится долго. я подозреваю, что здесь есть 0 толерантности при конвертации ошибок, поэтому единственный способ - это вручную. Я угадываю пробелы между почтовыми кодами, тире, буквами и цифрами, смешанными вместе, во всех возможных сочетаниях. О, парень. – Sharky

ответ

2

Это не соответствует Условиям использования Google, если вы не храните эти данные для отображения на карте Google, но это ужасно соблазнительно использовать их силу, потому что они просто так хороши на этом.

API-интерфейс Geocoding сможет обрабатывать практически любую комбинацию и вариацию адреса и почтового индекса, которые вы можете набросать на нее - с пробелами или без пробелов, первым или последним почтовым индексом и т. Д. И т. Д., Включая разные географические названия («Лондон») , "Лондрес").

Запрос на

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 страница описывает требования и ограничения по использованию сервиса.

Обратите внимание, что API Google угадает, если данные немного ошибочны. Ваш первоначальный пример 1234 ZC неверен, и API будет интерполировать, пытаясь дать вам то, с чем вы работаете. Убедитесь, что вы изучаете, как API реагирует на неправильные данные, и будьте осторожны, чтобы не стрелять в ногу с результатами.

+0

это хорошо, но если есть 0 толерантности к ошибкам, результат этого преобразования должен быть пересмотрен и проверен человеком. – Sharky

+0

@Sharky конечно. По опыту, это очень * надежно, пока поступающие данные хороши - по крайней мере, в Западной Европе и США, я думаю. Это может быть слегка отключено, если данные содержат даже небольшую ошибку, API затем начнет интерполяцию, иногда со странными результатами. –

+0

yup, это очень надежный, но входящие данные НЕ будут «хорошими». я много работал с вводом пользовательских данных. это безумие. пользователи не могут правильно ввести свое имя 2 раза подряд. комбинированные коробки, где бы они ни применимы, являются спасателем жизни. – 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? (включая некоторые списки регулярных выражений почтового кода для разных стран).