2012-01-18 81 views
0

我有以下的代码来验证英国的邮政编码我用这作为笨验证规则,但我得到以下警告消息:屋邮编验证警告消息

严重性:警告

消息:的preg_match()[function.preg匹配]:编译失败:错过)在偏移426

文件名:型号/ 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; 
    } 
} 
+1

你可以通过使它不区分大小写来简化你的正则表达式。 – Xophmeister 2012-01-18 10:31:09

+1

似乎不喜欢SW1A 1AA,这是一个有效的英国邮政编码 – 2012-01-18 10:33:09

回答

0

失踪)

你的(第一)开(没有关闭)。我建议使用文本编辑器(如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()。我不会将此添加到正则表达式中,因为它已经很长。

而且根据the documentation ...

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

+0

所有这些都可以使用preg_match吗? – user794846 2012-01-18 10:37:40

+0

我不知道*全部*,但我已经更新了我的答案。 – Johnsyweb 2012-01-18 10:47:59

+0

确定使用您的正则表达式更新了我的函数,但它仍然总是返回上面的错误消息 – user794846 2012-01-18 11:12:24