这是交易。。。
我想解析一个加拿大邮政编码(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$