php 我如何根据回归表达式验证我的模式

chhqkbe1  于 2023-04-10  发布在  PHP
关注(0)|答案(3)|浏览(71)

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

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

年和月的范围必须有效并且是最后的。最后5位数字是0到9的任意随机数字。
这是我做的,但是所有的心肺复苏都显示为无效

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

hvvq6cgz1#

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

avwztpqn

avwztpqn2#

在某个时候,你需要对验证规则进行更改,你会回到这段代码,然后说“WTF,这个正则表达式甚至可以吗?”,这可能是一周后的事情。
将其分解为子字符串很容易,可读性更强,可扩展性更强。例如:如何在正则表达式代码中添加描述性错误消息?

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)
apeeds0o

apeeds0o3#

试试看

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

相关问题