regex验证未解析if PHP中的字符串


regex validation not parsing string in if PHP

这是交易。。。

我想解析一个加拿大邮政编码(CapsLetterNumberCapsLetter NumberCaps LetterNumber:示例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";
}

则代码继续显示CCD_ 1。

问题是,无论我在$_POST['xtPostalCode']中输入什么,它都不会被REGEX解析。

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

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

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

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

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

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

/^(?:[A-Z][0-9]){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$