我需要以每个国家/地区为基础,以特定格式验证邮政编码.
例如:
$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)
每个国家/地区可以根据需要提供尽可能多的邮政编码格式变体; 哪里:
因此,如果我们采用Australia例如,它应该验证为true:
等等...
并且应该失败:
等等...
鉴于此,我正在尝试创建一个单一的函数,我可以使用它来验证给定国家/地区的邮政编码与邮政编码的所有变体.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
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
| 归档时间: |
|
| 查看次数: |
1275 次 |
| 最近记录: |