我需要根据国家的不同,在特定格式下验证邮政编码。
例如:
$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]
- 有时允许/包含 连字符
所以,以 澳大利亚
为例,以下内容应该验证通过:
- 1245
- 4791
- 7415
等等...
以下内容应该失败:
- a113
- 18q5
- 1s-s7
等等...
鉴于此,我正在尝试创建一个单一的函数,用于针对邮政编码的所有变化验证给定国家的邮政编码。如果邮政编码与至少一条规则匹配,则函数应返回 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
preg_match("/^$validation_rule$/", $postcode)
。 - cOle2A
。 - bansi