Uk-邮政编码验证警告消息


Uk postcode validation Warning message

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

严重性:警告

消息:preg_match()[function.preg match]:编译失败:丢失),偏移量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;
    }
} 

丢失)

您(第一次)打开的(没有关闭的)。我建议使用一个文本编辑器(如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可以很好地处理小写邮政编码条目。


以下是评论。

这不处理前导或尾随空格。如果这对您来说是一个问题,您可以很容易地向trim()添加一个调用。我不会把它添加到正则表达式中,因为它已经很长了。

根据文件。。。

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