动态邮政编码验证

Lat*_*san 7 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')
);
Run Code Online (Sandbox Code Playgroud)

每个国家/地区可以根据需要提供尽可能多的邮政编码格式变体; 哪里:

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

因此,如果我们采用Australia例如,它应该验证为true:

  • 1245
  • 4791
  • 7415

等等...

并且应该失败:

  • A113
  • 18q5
  • 1S-S7

等等...

鉴于此,我正在尝试创建一个单一的函数,我可以使用它来验证给定国家/地区的邮政编码与邮政编码的所有变体.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));

?>
Run Code Online (Sandbox Code Playgroud)

似乎通过返回true来工作.但它也会回归真实$myPostcode = '1468a';

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


更新

这是如何解决的; 使用Zend库的正则表达式:http://pastebin.com/DBKhpkur

pag*_*uca 0

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

正如 @cOle2 评论的那样,行

if (preg_match("/$validation_rule/", $postcode)) {
Run Code Online (Sandbox Code Playgroud)

应该改为

if (preg_match("/^$validation_rule$/", $postcode)) {
Run Code Online (Sandbox Code Playgroud)

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