Проверка почтового индекса США/Великобритании/Канады в PHP

Я не так хорош с регулярным выражением. Я хочу добавить функцию проверки, которая будет возвращать true/false, если введенная в нее строка является допустимым почтовым индексом/почтовым индексом США, Великобритании или Калифорнии.

США: NNNNN Калифорния: LNL NLN Великобритания: Множество комбинаций

L = буква, N = цифра

Есть отдельные функции для США и Канады, но мне не удалось придумать единую унифицированную функцию для этого.


person Community    schedule 04.11.2010    source источник
comment
Вы хотите выполнить настоящую проверку для Великобритании (т. е. найти только существующие почтовые индексы)? Или шаблона будет достаточно?   -  person Pekka    schedule 05.11.2010
comment
Тот же вопрос для США... 66666 соответствует шаблону, но не является допустимым почтовым индексом. Также есть форма NNNNN-NNNN ZIP+4.   -  person Stephen P    schedule 05.11.2010


Ответы (2)


Взгляните на Zend_Validate_Postcode из Zend Framework:

Zend_Validate_PostCode позволяет определить, является ли заданное значение допустимым почтовым индексом. Почтовые индексы относятся к городам и в некоторых регионах называются почтовыми индексами.

Zend_Validate_PostCode знает более 160 различных форматов почтовых индексов. Чтобы выбрать правильный формат, есть 2 способа. Вы можете либо использовать полную локаль, либо установить свой собственный формат вручную.

Я думаю, вы могли бы либо посмотреть исходный код, либо использовать его как отдельный компонент. У него могут быть зависимости внутри ZF, но вам определенно не нужно будет использовать всю структуру только для этого компонента. Надеюсь, это поможет.

person karim79    schedule 05.11.2010

Моим решением было бы использовать три отдельных регулярных выражения с использованием логических операторов OR:

if (
    preg_match('/^\d{5}(?:\-\d{4})?$/i', $code, $matches) OR
    preg_match('/^[a-z]\d[a-z] ?\d[a-z]\d$/i', $code, $matches) OR
    preg_match('/^[a-z]{1,2}\d{1,2} ?\d[a-z]{2}$/i', $code, $matches)
) {
    // deal with $matches here
}

Обратите внимание, что это работает, потому что PHP использует логику короткого замыкания. Как только один тест пройден, другие игнорируются, поэтому $matches не будет переопределен.

person lonesomeday    schedule 05.11.2010