我如何验证基于正则表达式的模式



我必须检查CPR是否有效所以我必须检查这些东西:

  • CPR只有9位
  • 前两位数字代表出生年份从1980年到2023年,所以cpr的前两位数字只需要年份的最后两位数字
  • 则CPR中的(第3/4位)数字表示月(即800412233出生于1980年和04月)。

年份和月份必须是合法的,且必须是最后一位,最后五位是0 ~ 9的任意数字。

我就是这么做的,但是所有的心肺复苏术都显示为无效

^(([8-9][0-9]|[0-1][0-9]|2[0-3]){2})(0[1-9]|1[0-2])(d{5})$

使用^([01289])d(0[1-9]|1[012])d{5}$。参见regex demonstrator

在某些时候,您将需要对验证规则进行更改,并且您将回到这段代码并问"这个正则表达式到底是做什么的?",这可能只需要一周的时间。

将其分解为子字符串很容易,可读性强得多,可扩展性也强得多。如何在正则表达式代码中添加描述性错误信息?

function validate($str) {
$yr = intval(substr($str, 0, 2));
$mo = intval(substr($str, 2, 2));
$code = substr($str, 4);

if( !(($yr >= 80 && $yr <= 99) || ( $yr >= 0 && $yr <= 23)) ) {
echo "Year $yr out of range.n";
return false;
}
if( $mo < 1 || $mo > 12 ) {
echo "Month $mo out of range.n";
return false;
}
return true;
}
var_dump(
validate('800412233'),
validate('790412233'),
validate('240412233'),
validate('800012233'),
validate('801312233'),
);

输出:

Year 79 out of range.
Year 24 out of range.
Month 0 out of range.
Month 13 out of range.
bool(true)
bool(false)
bool(false)
bool(false)
bool(false)

Try

^([0189][0-9]|2[0-3])(0[1-9]|1[1-2])(d{5})$