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

回到顶部