PHP中的英国邮政编码验证函数
创建一个函数来验证英国邮政编码似乎很简单,但是除了检查字符数之外,还有其他功能。实际上,英国邮政编码有几种不同的变体,特别是如果您包括BFPO和海外地址。官方邮政编码规范详细说明了邮政编码的结构,并且还有来自mod.uk的BFPO编号列表。
值得庆幸的是,约翰·加德纳(John Gardner)花了一些时间编写一个能够验证英国邮政编码的小功能,并且该功能已经在整个互联网上得到了普及。我在一个项目中遇到了这个函数,但是由于它没有归因于任何人,因此我认为它是由同一项目中的另一个编码器编写的。很高兴找到原始作者并给予他们荣誉。:)
我发现的原始版本已过时,因为它使用了旧的ereg PHP正则表达式函数,这导致了PHP 5.3中过时的错误。当时,我正在创建一个使用全部和部分邮政编码的搜索功能,因此我还更改了该功能,使其能够同时检测到这两者。下面的代码块是我对函数的看法。请注意,邮政编码是通过引用传递的,因此,如果找到邮政编码,则将其标准化为正确的格式。
/*** 函数查看字符串是否为英国邮政编码。邮政编码也是
* 格式化为不包含字符串。可以使用完整或部分邮政编码
*
* @param string $toCheck
* @return boolean
*/
function postcode_check(&$toCheck) {
// 允许的字母取决于它们在邮政编码中的位置。
$alpha1 = "[abcdefghijklmnoprstuwyz]"; // 角色1
$alpha2 = "[abcdefghklmnopqrstuvwxy]"; // 角色2
$alpha3 = "[abcdefghjkstuw]"; // 角色3
$alpha4 = "[abehmnprvwxy]"; // 角色4
$alpha5 = "[abdefghjlnpqrstuwxyz]"; // 角色5
// 邮政编码的表达式:AN NAA,ANN NAA,AAN NAA和AANN NAA(带空格)
// 或没有空格的AN,ANN,AAN,AANN
$pcexp[0] = '^(' . $alpha1 . '{1}' . $alpha2 . '{0,1}[0-9]{1,2})([[:space:]]{0,})([0-9]{1}' . $alpha5 . '{2})?$';
// 邮政编码的表达方式:ANA NAA
// 或无空格的ANA
$pcexp[1] = '^(' . $alpha1 . '{1}[0-9]{1}' . $alpha3 . '{1})([[:space:]]{0,})([0-9]{1}' . $alpha5 . '{2})?$';
// 邮政编码表示:AANA NAA
// 或没有空格的AANA
$pcexp[2] = '^(' . $alpha1 . '{1}' . $alpha2 . '[0-9]{1}' . $alpha4 . ')([[:space:]]{0,})([0-9]{1}' . $alpha5 . '{2})?$';
// 特殊邮政编码GIR 0AA的例外
// 或者只是GIR
$pcexp[3] = '^(gir)([[:space:]]{0,})?(0aa)?$';
// 标准BFPO编号
$pcexp[4] = '^(bfpo)([[:space:]]{0,})([0-9]{1,4})$';
// c / o BFPO编号
$pcexp[5] = '^(bfpo)([[:space:]]{0,})(c\/o([[:space:]]{0,})[0-9]{1,3})$';
// 海外地区
$pcexp[6] = '^([a-z]{4})([[:space:]]{0,})(1zz)$';
// 安基拉
$pcexp[7] = '^(ai\-2640)$';
// 加载要检查的字符串,将其转换为小写
$postcode = strtolower($toCheck);
// 假设我们不会找到有效的邮政编码
$valid = false;
// 根据六种邮政编码检查字符串
foreach ($pcexp as $regexp) {
if (preg_match('/' . $regexp . '/i', $postcode, $matches)) {
// 将新的邮政编码重新加载到form元素中
$postcode = strtoupper($matches[1]);
if (isset($matches[3])) {
$postcode .= ' ' . strtoupper($matches[3]);
}
// 考虑特殊的BFPO c / o格式
$postcode = preg_replace('/C\/O/', 'c/o ', $postcode);
// 记住,我们发现代码是有效的,并且从循环中中断
$valid = true;
break;
}
}
// 如果邮递区号是
// 有效的
if ($valid) {
$toCheck = $postcode;
return true;
} else {
return false;
}
}
通过以下方式运行该功能。
$postcode = 'WR5 3DA';
$valid = postcode_check($postcode);
if ($valid === FALSE) {
print $postcode . ' is invalid';
}
else {
print $postcode . ' is valid';
}
以上是 PHP中的英国邮政编码验证函数 的全部内容, 来源链接: utcz.com/z/361183.html