我需要知道这行代码的作用,试图弄清楚,因为我必须用 preg_match() 构建它,但我并不完全理解它:
ereg("([0-9]{1,2}).([0-9]{1,2}).([0-9]{4})", $date)
我知道它会检查日期,但我不知道以哪种方式。
谢谢你的帮助
我需要知道这行代码的作用,试图弄清楚,因为我必须用 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,并且必须连续四个
所以它正在寻找以下任何格式的日期:
更多将适合该模式,因此对于应该验证的内容来说,它不是一个很好的正则表达式。有很多示例正则表达式模式用于以这种格式匹配日期,所以如果你用谷歌搜索它,你很快就会有一个 PCRE。
这是一个相对简单的正则表达式(regex)。如果您要使用正则表达式,那么我建议您花一些时间来学习语法。http://regular-expressions.info是一个很好的学习起点。
“正则表达式”或“正则表达式”是一种用于搜索字符串的模式匹配语言。有许多方言,它们大多非常相似,但也有一些差异。PHP 从ereg()
使用一种特定方言的函数系列开始,然后切换到preg_xx()
使用稍微不同的正则表达式方言的函数。
两者之间在语法上有一些差异,这有助于学习,但它们相当小。事实上,对您来说好消息是,这里的模式在两者之间几乎相同。
除了模式本身之外,您需要了解的唯一其他主要区别是模式 inpreg_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');
这也一样,我只用 \d 替换 [0-9],用 \D 替换点(匹配所有)(非数字,但可以用 \. 或 [.-] 替换它)
preg_match("~\d{2}\D\d{2}\D\d{4}~", $date)
看起来它的匹配几乎是不可知的。
您可以将其解释为 mm.dd.yyyy 或 dd.mm.yyyy。如果您实际上是在尝试匹配/验证日期,我会考虑对其进行修改,因为 00.00.0000 将是匹配的,但在可能的历史背景之外是无效数据。
编辑:我忘记了“。” 在这种情况下,将匹配任何字符而不转义。