Php 需要从ereg()切换到preg_match()

Php 需要从ereg()切换到preg_match(),php,preg-match,ereg,Php,Preg Match,Ereg,我需要知道这行代码的作用,试图找出它,因为我必须使用preg_match构建它,但我没有完全理解它: ereg("([0-9]{1,2}).([0-9]{1,2}).([0-9]{4})", $date) 我知道它会检查日期,但我不知道用哪种方式 感谢您的帮助让我们来分析一下: ([0-9]{1,2}) 这将查找数字0到9-表示在括号[]中使用时的范围,其中可以有1到2个 . 这将查找任何单个字符 ([0-9]{1,2}) 这将查找从0到9的数字,其中可能还会有1到2个 . 这将再次查

我需要知道这行代码的作用,试图找出它,因为我必须使用preg_match构建它,但我没有完全理解它:

ereg("([0-9]{1,2}).([0-9]{1,2}).([0-9]{4})", $date)
我知道它会检查日期,但我不知道用哪种方式

感谢您的帮助

让我们来分析一下:

([0-9]{1,2})
这将查找数字0到9-表示在括号[]中使用时的范围,其中可以有1到2个

.
这将查找任何单个字符

([0-9]{1,2})
这将查找从0到9的数字,其中可能还会有1到2个

.
这将再次查找任何单个字符

([0-9]{4})
这将查找从0到9的数字,其中必须有四个连续出现

因此,它正在寻找以下任何一种格式的日期:

04 18 1973 04-18-1973 04/18/1973 04.18.1973
更多的将适合这种模式,因此它不是一个很好的正则表达式,它应该验证什么。在这种格式中,有很多用于填充日期的示例正则表达式模式,因此如果你用谷歌搜索它,你很快就会有一个PCRE。

看起来它在匹配方面几乎是不可知的

您可以将其解释为mm.dd.yyyy或dd.mm.yyyy。我会考虑修改它,如果您实际上试图匹配/验证日期为.00 .00万将是匹配,但是无效的数据,在可能的历史上下文之外。


编辑:我忘了“.”在这种情况下,它将匹配任何字符而不转义。

这是一个相对简单的正则表达式正则表达式。如果您打算使用正则表达式,那么我建议您花一点时间来学习语法。学习的好起点是

正则表达式或正则表达式是一种用于搜索字符串的模式匹配语言。有许多方言,它们大多相当相似,但也有一些差异。PHP从使用一种特定方言的ereg函数家族开始,然后切换到preg_xx函数以使用稍微不同的regex方言

这两种语言在语法上有一些不同,这对学习是有帮助的,但它们的差别很小。事实上,对你们来说好消息是,这两种模式几乎完全相同

除了模式本身之外,您需要知道的另一个主要区别是preg_match中的模式必须在模式字符串的两端都有一对分隔字符。最常用的字符是斜杠/

因此,在本例中,您只需将ereg替换为preg_match,并将斜杠添加到模式的任一端:

$result = preg_match("/([0-9]{1,2}).([0-9]{1,2}).([0-9]{4})/", $date);
                      ^                                    ^
                  slash here                           and here
这仍然有助于理解模式正在做什么,但是为了快速获胜,这可能是您在这种情况下需要做的全部。其他情况可能更复杂,但大多数情况都会如此简单

去阅读我之前链接的regular-expressions.info网站;它会帮助你的

然而,我要补充一点,这里给出的模式实际上写得很糟糕。它打算匹配一个日期字符串,但将匹配许多它可能不打算匹配的内容

您可以通过找到一个更好的用于匹配日期的正则表达式来修复它,但是很有可能编写代码时根本不需要正则表达式——PHP内置了一些非常好的日期处理功能。你需要考虑它周围的代码,了解它在做什么,但是完全可以用这样的东西来代替整个事物:

$dateObject = DateTime::CreateFromFormat($date, 'd.M.Y');

同样,我只将[0-9]替换为\d,将匹配所有字符的点替换为\d非数字,但可以将其替换为\。或[.-]

preg_match("~\d{2}\D\d{2}\D\d{4}~", $date)

0-9一个或两个数字后跟句点。0-9一个或两个数字后跟句点。0-9 4位。请注意-仅表示[]范围内的范围。感谢您指出这一点-它也会考虑到900x00 X000是一个数据。我想你可以按自己的方式输入日期。谢谢,我会试试的真是太棒了!谢谢你的发帖。我会看看这个网站