php - 动态邮政编码验证

标签 php postal-code

我需要按国家/地区以提供给我的特定格式验证邮政编码。

例如:

$postcode_validation = array
(
    'Australia'     => array('NNNN'),
    'Bahrain'       => array('NNN', 'NNNN'),
    'Netherlands'   => array('NNNN AA'),
    'United States' => array('NNNNN', 'NNNNN-NNNN', 'NNNNN-NNNNNN')
);

每个国家/地区都可以根据需要使用多种邮政编码格式;其中:

  • N = 数字 [0-9]
  • A = 字母 [a-zA-Z]
  • 它有时允许/包含hypens

因此,如果我们以澳大利亚为例,它应该验证为 true:

  • 1245
  • 4791
  • 7415

等...

并且应该失败:

  • a113
  • 18q5
  • 1s-s7

等...

鉴于此,我正在尝试创建一个函数,我可以使用它来根据邮政编码的所有变化来验证给定国家/地区的邮政编码。如果邮政编码与至少 1 条规则匹配,函数应返回 true,如果没有匹配,则返回 false

所以,这就是我尝试这样做的方式(从简单的开始):

<?php

// mapping
$postcode_validation = array
(
    'Australia'     => array('NNNN'),
    'Bahrain'       => array('NNN', 'NNNN'),
    'Netherlands'   => array('NNNN AA'),
    'United States' => array('NNNNN', 'NNNNN-NNNN', 'NNNNN-NNNNNN')
);

// helper function
function isPostcodeValid($country, $postcode)
{
    // Load Mapping
    global $postcode_validation;

    // Init
    $is_valid = false;

    // Check If Country Exists
    if (!array_key_exists($country, $postcode_validation))
        return false;

    // Load Postcode Validation Rules
    $validation_rules = $postcode_validation[$country];

    // Iterate Through Rules And Check
    foreach ($validation_rules as $validation_rule)
    {
        // Replace N with \d for regex
        $validation_rule = str_replace('N', '\\d', $validation_rule);

        // Check If Postcode Matches Pattern
        if (preg_match("/$validation_rule/", $postcode)) {
            $is_valid = true;
            break;
        }
    }

    // Finished
    return $is_valid;
}

// Test
$myCountry = 'Australia';
$myPostcode = '1468';
var_dump(isPostcodeValid($myCountry, $myPostcode));

?>

似乎通过返回 true 来工作。但它也为 $myPostcode = '1468a';

返回 true

有没有人有办法通过固定规则进行动态邮政编码验证?


更新

问题是这样解决的;通过使用 Zend 库中的正则表达式:http://pastebin.com/DBKhpkur

最佳答案

OP 的正则表达式无法正常工作,因为它没有考虑行的开始和结束。

正如@cOle2 所评论的那样

if (preg_match("/$validation_rule/", $postcode)) {

应该改为

if (preg_match("/^$validation_rule$/", $postcode)) {

此外,正如 OP 在编辑中指出的那样,另一个好的解决方案是使用 Zend 库中的正则表达式:http://pastebin.com/DBKhpkur

关于php - 动态邮政编码验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24808815/

相关文章:

php - 构建一个组件

database - 是否可以有一个邮政编码区域属于多个时区?

mysql - 在 mysql 中再次匹配长字符串(完整邮政编码)和短字符串(邮政编码开头)

php - 如何防止 WooCommerce 中某些国家/地区的邮政编码/邮政编码字段被隐藏

php - MySQL 全文搜索 - 搜索具有精确匹配和通配符的单词,但首先获得精确匹配其他匹配

javascript - 通过 jQuery 发布一个巨大的 html 表单

php - 为openCV创建PHP扩展时出错

php - 如何使用mysql从php中的jquery自动完成框获取字符串数据

asp.net - 英国邮政编码查找流程的好例子

.net - 使用 SQL Server 数据库和 .NET 框架存储和检索邮政地址的最佳方法是什么?