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



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

ereg("([0-9]{1,2}).([0-9]{1,2}).([0-9]{4})", $date)

我知道它查日期,但我不知道用什么方法。

thanks for some help

让我们来分析一下:

([0-9]{1,2})

查找从0到9的数字(-在括号[]中表示一个范围),可以有1个或2个。

.

查找任何单个字符

([0-9]{1,2})

查找从0到9的数字,可以有1或2个

.

查找任意单个字符

([0-9]{4})

查找从0到9的数字,并且一行中必须有4个

所以它正在查找以下任意格式的日期:

  • 04 18 1973
  • 04-18-1973
  • 04/18/1973
  • 04.18.1973

More将符合该模式,因此对于它应该验证的内容来说,它不是一个很好的正则表达式。有很多这种格式的匹配日期的正则表达式模式样本,所以如果你谷歌一下,你很快就会得到一个PCRE。

这是一个相对简单的正则表达式(regex)。如果您要使用regex,那么我建议您花一点时间学习它的语法。一个很好的学习起点是http://regular-expressions.info。

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

两者在语法上有一些不同,这对学习是有帮助的,但它们是相当小的。事实上,对你来说好消息是,这里的模式在两者之间几乎是相同的。

除了模式本身之外,您需要知道的唯一其他主要区别是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');

看起来它在匹配中几乎是不可知的。

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

编辑:我忘了。

这做同样的,我只替换[0-9]由d,点(匹配所有)由d(一个非数字,但可以替换它由。或(。-])

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

最新更新