1

这是交易...

如果有一个,我想解析一个加拿大邮政编码(CapsLetterNumberCapsLetterNumberCapsLetterNumber:例如 A1B2C3 或 G2V3V4)。

我有这个代码(PHP):

//Create new SESSION variable to store a warning
$_SESSION['msg'] = "";
//IF empty do nothing, IF NOT empty parse, IF NOT match regex put message in msg
if(!preg_match('^([A-Z][0-9][A-Z][0-9][A-Z][0-9])?$^', $_POST['txtPostalCode']) && $_POST['txtPostalCode'] != "")
{
    $_SESSION['msg'] .= "Warning invalide Postal Code";
}

然后代码继续显示$_SESSION['msg']

问题是我在 $_POST['txtPostalCode'] 中输入的任何内容都不会被 REGEX 解析。

4

2 回答 2

4

您将整个捕获组设为可选:

^([A-Z][0-9][A-Z][0-9][A-Z][0-9])?$^
                                 ^

使用正则表达式元数据字符作为分隔符也不是一个好主意。试试这个正则表达式,它匹配一个大写字母和一个数字三次:

/^((?:[A-Z][0-9]){3})$/

您不需要将捕获组设为可选,因为您处理了用户未使用&& $_POST['txtPostalCode'] != ""if 语句部分提交代码时的逻辑。

最后,由于您甚至没有使用此正则表达式中的匹配项,因此您不需要捕获组:

/^(?:[A-Z][0-9]){3}$/
于 2013-07-09T13:30:47.990 回答
3

您的正则表达式将匹配无效的邮政编码。

一个快速的谷歌搜索“加拿大邮政编码正则表达式”买了

^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$

您可能还希望将您的$_POST['txtPostalCode'] != ""条件放在首位,因为如果值一开始就为空,则执行正则表达式毫无意义。

编辑:正如评论所指出的,量词是多余的:

^[ABCEGHJKLMNPRSTVXY]\d[A-Z] *\d[A-Z]\d$
于 2013-07-09T13:32:44.087 回答