PHP动态正则表达式?
我对正则表达式比较陌生,但我设法创建了一个工作表达式来验证日期(没有闰年,假设人们输入一个月的有效数字为30或31) 这是表达方式: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}$/ 当我尝试使用这个表达式时,它总是告诉我编译失败了,因
/^\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函数。