【问题标题】:Uk postcode validation Warning message英国邮政编码验证警告信息
【发布时间】:2012-01-18 10:20:42
【问题描述】:

我有以下代码来验证英国邮政编码我在 codeigniter 中使用它作为验证规则,但我收到以下警告消息:

严重性:警告

消息:preg_match() [function.preg-match]: Compilation failed: missing ) at offset 426

文件名:models/user_profile.php

行号:126

无论输入哪个邮政编码,它总是返回 false 任何人都可以发现什么问题吗?

//Check and validate uk postcode
function _valid_postcode($field) {
    $regex = '!^([A-PR-UWYZa-pr-uwyz]([0-9]{1,2}|([A-HK-Ya-hk-y][0-9]|[A-HK-Ya-hk-y][0-9]([0-9]|[ABEHMNPRV-Yabehmnprv-y]))|[0-9][A-HJKS-UWa-hjks-uw])\{0,1}[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}|([Gg][Ii][Rr]\0[Aa][Aa])|([Ss][Aa][Nn]\{0,1}[Tt][Aa]1)|([Bb][Ff][Pp][Oo]\{0,1}([Cc]\/[Oo]\)?[0-9]{1,4})|(([Aa][Ss][Cc][Nn]|[Bb][Bb][Nn][Dd]|[BFSbfs][Ii][Qq][Qq]|[Pp][Cc][Rr][Nn]|[Ss][Tt][Hh][Ll]|[Tt][Dd][Cc][Uu]|[Tt][Kk][Cc][Aa])\{0,1}1[Zz][Zz]))$!';

    $result = preg_match($regex, $field);

    if($result > 0) {
        return TRUE;
    } else {
        $this->error_message($field, 'Please enter a valid postcode');
        //return FALSE;
    }
} 

【问题讨论】:

  • 您可以通过使其不区分大小写来简化您的正则表达式。
  • 不喜欢 SW1A 1AA,这是一个有效的英国邮政编码

标签: php regex validation codeigniter


【解决方案1】:

缺少)

您的(第一个)开头( 没有结尾)。我建议使用文本编辑器(例如Vim)来帮助您匹配括号。

我无法从那个庞大的正则表达式中看出 结束 ) 应该去哪里。

也许可以尝试以下方法之一:http://regexlib.com/REDetails.aspx?regexp_id=260

例如:

function is_valid_postcode($postcode) {
    $validation_expression = '/^(((([A-PR-UWYZ][0-9][0-9A-HJKS-UW]?)|([A-PR-UWYZ][A-HK-Y][0-9][0-9ABEHMNPRV-Y]?))\s{0,2}[0-9]([ABD-HJLNP-UW-Z]{2}))|(GIR\s{0,2}0AA))$/i';

    return preg_match($validation_expression, $postcode);
}

...返回我尝试过的样本(包括“SW1A 1AA”)的预期结果,并在末尾添加i 可以很好地处理小写邮政编码条目。


关注 cmets。

这不处理前导或尾随空格。如果这给您带来问题,您可以轻松地添加对 trim() 的呼叫。我不会将它添加到正则表达式中,因为它已经很长了。

根据the documentation...

preg_match() 返回模式匹配的次数。这将是 0 次(不匹配)或 1 次,因为 preg_match() 将在第一次匹配后停止搜索。如果发生错误,preg_match() 返回FALSE [0]。

【讨论】:

  • ok 用你的正则表达式更新了我的函数,但它仍然总是返回如上的错误消息
  • 我认为问题在于 if($result > 0) 我不确定 preg_match 目前应该返回什么,这似乎导致它一直返回 false
  • 如果你收到同样的错误信息,你仍然有同样的问题。
  • @user794846:如果你不确定一个函数应该返回什么,你应该阅读文档(我现在已经在我的回答中链接到这个)!也许您可以使用一些未通过测试的示例数据来更新您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多