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

时间:2013-04-30 20:21:54

标签: php preg-match ereg

我需要知道这行代码是做什么的,试图弄明白,因为我必须使用preg_match()构建它,但我完全不理解它:

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

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

感谢您的帮助

4 个答案:

答案 0 :(得分:3)

让我们打破这个:

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

更多将适合该模式,因此它不是一个非常好的正则表达式,它应该验证什么。这种格式的matting日期有很多样本正则表达式模式,所以如果你谷歌它,你马上就会有PCRE。

答案 1 :(得分:2)

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

“正则表达式”或“正则表达式”是用于搜索字符串的模式匹配语言。有许多方言,大多相似但有一些差异。 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');

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

这样做,我只用\ d替换[0-9],用\ D替换点(全部匹配)(非数字,但可以用\。或[.-]替换它)

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