PHP中的英国邮政编码验证函数
创建一个函数来验证英国邮政编码似乎很简单,但是除了检查字符数之外,还有其他功能。实际上,英国邮政编码有几种不同的变体,特别是如果您包括BFPO和海外地址。官方邮政编码规范详细说明了邮政编码的结构,并且还有来自mod.uk的BFPO编号列表。
值得庆幸的是,约翰·加德纳(JohnGardner)花了一些时间编写一个能够验证英国邮政编码的小功能,并且该功能已经在整个互联网上得到了普及。我在一个项目中遇到了这个函数,但是由于它没有归因于任何人,因此我认为它是由同一项目中的另一个编码器编写的。很高兴找到原始作者并给予他们荣誉。:)
我发现的原始版本已过时,因为它使用了旧的eregPHP正则表达式函数,这导致了PHP5.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'; }