Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP动态正则表达式?_Php_Regex_Validation - Fatal编程技术网

PHP动态正则表达式?

PHP动态正则表达式?,php,regex,validation,Php,Regex,Validation,我对正则表达式比较陌生,但我设法创建了一个工作表达式来验证日期(没有闰年,假设人们输入一个月的有效数字为30或31) 这是表达方式: /^\d[1-31]{2}-\d[1-12]{2}-\d[1900-2009]{4}$/ 但是我想要一个动态正则表达式,比如: $yearSpan = (date("Y") - 110)."-".date("Y"); /^\d[1-31]{2}\-\d[1-12]{2}\-\d[$yearSpan]{4}$/ 当我尝试使用这个表达式时,它总是告诉我编译失败了,因

我对正则表达式比较陌生,但我设法创建了一个工作表达式来验证日期(没有闰年,假设人们输入一个月的有效数字为30或31)

这是表达方式:
/^\d[1-31]{2}-\d[1-12]{2}-\d[1900-2009]{4}$/

但是我想要一个动态正则表达式,比如:

$yearSpan = (date("Y") - 110)."-".date("Y");
/^\d[1-31]{2}\-\d[1-12]{2}\-\d[$yearSpan]{4}$/
当我尝试使用这个表达式时,它总是告诉我编译失败了,因为字符类中的一个范围顺序错误

我用这个表达式来验证出生日期,最好不要在一年过去的每一天都更新它


有什么建议吗?

您可以使用PHP日期和时间函数来完成

您可以使用PHP日期和时间函数来完成

< P>我认为你应该考虑使用一些日期/时间函数来实现这个目的。< /P> 你用错了角色类<代码>[1-31]、
[1-12]
[1900-2009]
将不会检查它们中的范围。这不是工作的方式,因此这不是你用正则表达式检查的方式

字符类
[A-r]
匹配从
A
r
的任何字符<代码>[a-rx]匹配从
a
r
的任何字符以及字符
x
。类似地,
[1-39]
匹配从
1
3
的任何字符和字符
9
——因此它匹配1,2,3和9中的一个,而不是您想要的1到39之间的任何数字

[1-31]{2}
匹配两个连续的数字(最后一个1是多余的),都在1到3的范围内-
33
是有效匹配

要匹配从1到31的数字,正确的正则表达式是
0?[1-9]|[1-2][0-9]| 3[0-1]
。(“0”负责零填充,如
01-09-2009

月份:
0?[1-9]| 1[0-2]

年份:
19[0-9]{2}200[0-9]

而且
-
不是字符类之外的元字符-您不需要转义它

正确的正则表达式应该是:

/^(0?[1-9]|[1-2][0-9]|3[0-1])-(0?[1-9]|1[0-2])-(19[0-9]{2}|200[0-9])$/
如果您对捕获值不感兴趣,可以将其编写为:

/^(?:0?[1-9]|[1-2][0-9]|3[0-1])-(?:0?[1-9]|1[0-2])-(?:19[0-9]{2}|200[0-9])$/

我认为你应该考虑使用一些日期/时间函数来实现这个目的。

您以错误的方式使用字符类。
[1-31]
[1-12]
[1900-2009]
将不会检查它们中的范围。这不是工作方式,因此也不是使用regex检查的方式

字符类
[A-r]
匹配
A
r
[A-rx]
中的任何字符
A
r
和字符
x
。类似地,
[1-39]
匹配从
1
3
的任何字符和字符
9
——因此它匹配1、2、3和9中的一个,而不是您想要的1到39之间的任何数字

[1-31]{2}
匹配两个连续的数字(最后一个1是多余的),都在1到3的范围内-
33
是有效匹配

要匹配从1到31的数字,正确的正则表达式是
0?[1-9]|[1-2][0-9]|[3[0-1]
('0')负责零填充,如
01-09-2009

月份:
0?[1-9]| 1[0-2]

年份:
19[0-9]{2}200[0-9]

而且
-
不是字符类之外的元字符-您不需要转义它

正确的正则表达式应该是:

/^(0?[1-9]|[1-2][0-9]|3[0-1])-(0?[1-9]|1[0-2])-(19[0-9]{2}|200[0-9])$/
如果您对捕获值不感兴趣,可以将其编写为:

/^(?:0?[1-9]|[1-2][0-9]|3[0-1])-(?:0?[1-9]|1[0-2])-(?:19[0-9]{2}|200[0-9])$/

谢谢你的清晰回答!我将使用Rimian提到的checkdate函数。谢谢你的清晰回答!我将使用Rimian提到的checkdate函数。