【问题标题】:Dynamic Postcode Validation动态邮政编码验证
【发布时间】:2014-09-08 15:16:04
【问题描述】:

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

例如:

$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

所以,如果我们以Australia 为例,它应该验证为真:

  • 1245
  • 4791
  • 7415

等等……

并且应该失败:

  • a113
  • 18q5
  • 1s-s7

等等……

鉴于此,我正在尝试创建一个函数,可用于根据邮政编码的所有变体来验证给定国家/地区的邮政编码。如果邮政编码与规则中的至少 1 条匹配,则函数应为 return true,如果未匹配,则应为 return 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

【问题讨论】:

  • 将开始和结束锚点添加到您的正则表达式:preg_match("/^$validation_rule$/", $postcode)
  • 注意:为了清楚起见,您可能会省略,您还需要替换A。

标签: php postal-code


【解决方案1】:

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

正如@cOle2 所说,行

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

应该改为

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

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

【讨论】:

  • 伙计们,我在 OP 5 年后发布了这个答案,所以这个问题最终不会出现在未回答的问题搜索中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 2018-07-21
  • 1970-01-01
  • 2022-12-11
  • 2013-05-16
  • 1970-01-01
相关资源
最近更新 更多