2009-07-02 86 views
2

中回覆^我无法完全理解^在preg_match中正在做什么。Preg Match ^在php

if (preg_match('~^(\d\d\d\d)(-(\d{1,2})(-(\d{1,2}))?)?$~', trim($date), $dateParts)) { 
    echo the $dateparts and do some magic with them 
} else { 
    tell me the date is formatted wrong 
} 

依我之见,这是想看看是否在$日期,我读出 4小数格式相匹配 - 1或2位小数 - 1或2位小数

如果它不匹配,那么IF语句显示日期,如果没有,则会给出错误的日期格式错误。

然而,只是通过它的一年 $ date ='1977'没有别的(没有日期或月)它仍然通过为真,并显示日期部分,我会认为它会抛出一个错误?

有人能指出我在正则表达式中缺少的东西吗?我猜这是^或可能是最后的?$可能意味着只匹配它的一部分?

+0

等于http://stackoverflow.com/questions/938100/tilde-operator-in-regular-expressions? – l0b0 2009-07-02 11:30:19

回答

3

有没有必要组绝对一切。这看起来更好,并会做相同的:

preg_match('~^\d{4}(-\d{1,2}(-\d{1,2})?)?$~', trim($date), $dateParts) 

这也解释了为什么“1977”被接受 - 的月份和日期部分是可选(问号使得一些可选)。

要做到你所说的( “4个小数 - 1或2位小数 - 1或2位小数”),您需要同时删除可选组:

preg_match('~^\d{4}-\d{1,2}-\d{1,2}$~', trim($date), $dateParts) 

的 “^” 和 “$”与你所看到的问题无关。它们只是字符串开头和字符串结尾的锚点,确保没有其他比在检查的字符串中描述的模式。将它们关闭并且"blah 1977-01-01 blah"将开始匹配。

+2

这很好地回答了我的问题,并指出了我遇到的具体问题。 – 2009-07-02 11:50:52

+0

你刚刚被授予正确的答案,有4个非常好的其他答案,但我觉得你在我想做的事情上帮助了我最多。从来没有这样一个良好的回应,不确定是谁给予'成功'的答案也是一个很好的问题:) – 2009-07-02 11:55:05

2

试试这个:

'~^(\d\d\d\d)-(\d{1,2})-(\d{1,2})$~' 

的问题是在正则表达式中允许的月份和日期作为可选用“?”字符。

+1

感谢您的快速和明确的回应。 – 2009-07-02 11:53:51

2

^$锚分别在传递的字符串的你的图案的起点和终点。该?是乘法器,匹配0或前图形的1(在这种情况下,parenthesised位)。

您的模式匹配一​​年,一年和一个月,或一年,一个月和一个日期;如果你遵循括号,你会看到最后的?在一年后的整个模式周围的parens上运行。

^ # beginning of string 
    (\d\d\d\d) #year 
    (
     -(\d{1,2}) #month after a dash 
     (
      -(\d{1,2}) #date after a dash 
     )? #date optional 
    )? # month and date optional 
$ # end of string 
+1

谢谢你的分解,也帮了我很多。 – 2009-07-02 11:51:49

2

好吧,让我们打破了这个为你:

  • “〜^(\ d \ d \ d \ d)( - (\ d {1,2})( - (\ d { '})?)?$〜'
  • - 开头和结尾都是RegExp-delimiters,所以它们不是真正的正则表达式的一部分。
  • ^ - 均值“这是行的开头”
    • 避免了字符串中间相匹配,和主持人它,这样的字符串的开头必须匹配
  • (\ d \ d \ d \ d) - 比赛(和捕获)四位数字,而不是可有可无的
    • 这也可以写成\ d {4}
  • ( - (\ d {1,2})( - (\ d {1,2}))?)? - 匹配(并捕获)可选组。
    • 它说,如果这种组存在,它必须是一个破折号,后面跟着一个或两个数字(天或月),其次是一个破折号,后面跟着一个或两个数字(天或月)
  • $ - 意味着字符串的结尾,所以在字符串的开头加上^表示整个字符串必须与正则表达式匹配。

什么这个正则表达式匹配的一些例子:

  • 1982年8月11日
  • 1982-30-01
  • 8127-99-52

一些例子那将不符合:

  • 82-08-11
  • 2009-10

正如你可以看到,这个正则表达式将接受是不是真的有效日期,一些“日期”,所以我可能会通过某种带有日期运行处理功能也是如此,如strtotime