2016-12-05 9 views
1

Я пробовал один на сайте .gov, как указано на многих вопросах здесь, но он, похоже, не работает для коротких почтовых индексов.Validate UK Postcode - короткая и длинная версия

Мое регулярное выражение:

preg_match('^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))^', $this->post['location'], $matches) 

Когда я использую длинный почтовый индекс формата: AA9 9ZZ это работает, но один из формата AA9 оленьих кожи. Мне нужно следующие форматы работы:

  • AA9
  • AA99
  • AA9 9ZZ
  • AA99 9ZZ
+0

Во-первых, не используйте '^' в качестве разделителя шаблона, а также использование это с '$' ancho Ваш шаблон. Замените группы захвата группами, не связанными с захватом, используйте флаг i, удалите ненужные группы. –

+0

@CasimiretHippolyte ive изменил это теперь, регулярное выражение, похоже, проверяет длинные почтовые индексы, но не сокращенные версии. –

+0

Это только первый шаг задания (в частности, для его более читаемости), а не для решения. –

ответ

0

Согласно образцу вы дали и сделать вторую часть по желанию, я получаю:

~^(?:gir(?: *0aa)?|[a-pr-uwyz](?:[a-hk-y]?[0-9]+|[0-9][a-hjkstuw]|[a-hk-y][0-9][abehmnprv-y])(?: *[0-9][abd-hjlnp-uw-z]{2})?)$~i 

demo

или сделать его более удобным для чтения:

~ # pattern delimiter 
^ # start of the string anchor 
(?: # branch 1 
    gir 
    (?:[ ]*0aa)? # second part optional (branch 1) 
    | # branch 2 
    [a-pr-uwyz] # I put it in factor to shorten the pattern 
    (?: 
     [a-hk-y]?[0-9]+ 
     | 
     [0-9][a-hjkstuw] 
     | 
     [a-hk-y][0-9][abehmnprv-y] 
    ) 
    (?:[ ]*[0-9][abd-hjlnp-uw-z]{2})? # second part optional (branch 2) 
) 
$ # end of the string anchor 
~ix 
0

^[A-Z]{1,2}\d{1,2}(?:(?:)?\d[A-Z]{2})?$ это образец, который я мог придумать, и это, кажется, работает.

Возможно, это может быть улучшено. Я не Regexpert.

Here's a live example

0

В связи с тем, как работают почтовые индексы Великобритании , проверка их с помощью regex не является надежным решением. Две основные проблемы:

  • Royal Mail может изменить формат некоторых почтовых индексов, добавив подрайоны, которые не охвачены регулярным выражением, которое вы решили использовать.
  • Проверка с помощью регулярных выражений гарантирует, что почтовый индекс будет в допустимом формате в соответствии с вашими правилами регулярного выражения, а не то, что он является почтовым индексом, который существует как часть адреса.

Royal Mail предоставляет PAF Database, который содержит все адреса Великобритании, включая почтовые индексы. Многие компании открыли эти данные через API и плагины веб-сайтов.

Например, я работаю в компании под названием PCA Predict, и у нас есть a demo нашего решения в действии. Это плагин для онлайн-форм выписки, который позволяет клиенту начать вводить какую-либо часть своего адреса и автоматически заполнять поля, когда они выбирают их.

Мы также предлагаем API REST для беспроблемной проверки и возврата адресов.

Пожалуйста, не стесняйтесь комментировать, если вам нужна помощь при проверке адреса, так как это может быть намного сложнее, чем изначально выглядит! Я также не говорю, что вы должны использовать наши услуги, но отпустите его, и у Google есть и другие варианты.

0

У меня была такая же проблема, и очень сложно проверить почтовый индекс, «Ройал-мейл» добавить и удалить почтовые индексы довольно часто.поэтому в течение последних 2 недель я создавал адресную базу данных и создал совершенно неприятный API для бесплатного использования, вы можете проверить почтовый индекс и он будет возвращать каждый адрес для этого почтового индекса.

Надеюсь, это полезно.

https://www.pervazive.co.uk/free-api-for-uk-postcode-lookup/

Endpoint

GET: https://api.pervazive.co.uk/postcode.php?postcode=[POSTCODE] 

Response

Request GET: -> https://api.pervazive.co.uk/postcode.php?postcode=AB10+1AB 

Вернуться Формат: JSON

{"predictions":[ 
{"ID":"0","Address":"Aberdeen City Council, Marischal College, Broad Street, Aberdeen, Aberdeenshire, AB10 1AB","Postcode":"AB10 1AB"} 
],"Execution_Time":"0.50983214378357","status":"200"}