PHP使用正则表达式验证CRON表达式

3

可能是重复问题:
使用PHP验证Crontab条目

我已经到处搜索过了,但我的正则表达式很差,所以我寻求帮助。

我正在构建一个基于Web的CRON工具,表单只能传递以下内容到处理脚本中。'0-99' ',' '*' '-' '/'

我想用简单的preg_match在PHP中验证输入,但似乎无法得出正确的正则表达式。有人可以帮忙吗? 此外,我将验证cron中的每个项目,即不是 * * * * * 而是分钟值,然后是小时值等等。这样可以发送更具体的错误。

传递值的示例:

*
0,10
*/5
1,3,5
1-5

这里有一个简单的尝试,只是为了匹配数字和星号 *

/[0-9*]/

任何帮助都将是极好的。

谢谢


“你将进行验证” - 你的意思是正则表达式应该进行验证,还是在正则表达式匹配后再进行验证?如果是前者,那么我们需要更多关于允许/禁止的信息。你的例子不足以推断这一点。此外,你所说的“0-99”是指允许的数字范围,因此不应匹配“100”吗? - Tim Pietzcker
好的,我已经阅读了使用PHP验证Crontab条目的链接,但它并没有给我所需的内容。 - Stacky
在验证方面,我的意思是使用正则表达式匹配从表单传递的字符串。该字符串将根据上述任何示例进行处理,并且实际上在仔细检查后,要匹配的数字当然只能是每月31天内的0到最大数字。 - Stacky
1个回答

5

让我们看一下:

$pattern = '/^(?:[1-9]?\d|\*)(?:(?:[\/-][1-9]?\d)|(?:,[1-9]?\d)+)?$/';

这个模式可以匹配合理子集的有效 CRON 语句。它确实匹配了您提供的每一个例子。但确切模式取决于您定义的语法。

编辑:
忘记提到仅使用正则表达式匹配是不够的。它只能检查输入是否在(简化)语法方面正确。其他方面,您需要根据语义验证输入(例如,小时 0-23;日期 1-30/1 等)。

是的,根据我给出的示例,这种模式似乎非常适用于单个CRON模式。不错! - Stacky
^(((?:[1-9]?\d|*)(/[0-9]{1,2}){0,1}\s){4}(?:([1-9]?\d|*)(/[0-9]{1,2}){0,1}|(MON)|(TUE)|(WED)|(THU)|(FRI)|(SAT)|(SUN))){1}$ - Sheshgiri Anvekar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接