0

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

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

我知道它会检查日期,但我不知道以哪种方式。

谢谢你的帮助

4

4 回答 4

3

让我们分解一下:

([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
  • 1973 年 4 月 18 日
  • 04.18.1973

更多将适合该模式,因此对于应该验证的内容来说,它不是一个很好的正则表达式。有很多示例正则表达式模式用于以这种格式匹配日期,所以如果你用谷歌搜索它,你很快就会有一个 PCRE。

于 2013-04-30T20:24:26.333 回答
2

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

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

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

除了模式本身之外,您需要了解的唯一其他主要区别是模式 inpreg_match()必须在模式字符串的任一端有一对定界字符。最常用的字符是斜线 ( /)。

所以在这种情况下,您需要做的就是交换eregpreg_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');
于 2013-04-30T20:35:10.373 回答
1

这也一样,我只用 \d 替换 [0-9],用 \D 替换点(匹配所有)(非数字,但可以用 \. 或 [.-] 替换它)

preg_match("~\d{2}\D\d{2}\D\d{4}~", $date)
于 2013-04-30T20:37:13.713 回答
1

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

您可以将其解释为 mm.dd.yyyy 或 dd.mm.yyyy。如果您实际上是在尝试匹配/验证日期,我会考虑对其进行修改,因为 00.00.0000 将是匹配的,但在可能的历史背景之外是无效数据。

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

于 2013-04-30T20:27:15.797 回答