代码之家  ›  专栏  ›  技术社区  ›  Paul M

php中的preg match扬抑符^。

  •  2
  • Paul M  · 技术社区  · 17 年前

    我不能完全理解我在赛前比赛中所做的一切。

     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
     }
    

    如我所见,这是想看看$date是否与我读作的格式相匹配。 4位小数-1或2位小数-1或2位小数

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

    但是一年过去了 $date='1977'没有其他内容(没有天或月),它仍然是真实的,并显示日期部分,我想它会抛出一个错误吗?

    有人能指出正则表达式中缺少的内容吗?我猜是^还是可能是?末尾的$可能意味着只匹配它的一部分?

    4 回复  |  直到 17 年前
        1
  •  3
  •   Tomalak    17 年前

    不需要分组 完全可以。 . 这看起来更好,也会有同样的效果:

    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
  •  2
  •   karim79    17 年前

    试试这个:

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

    问题是regex允许使用“?”作为可选的月份和日期。性格。

        3
  •  2
  •   Jeremy Smyth    17 年前

    ^ 和 $ 将您的模式分别锚定到传入字符串的开头和结尾。这个 ? 是一个乘数,匹配前面模式的0或1(在本例中是带括号的位)。

    你的模式匹配一年,或者一年一个月,或者一年一个月和一个日期;如果你在括号后面,你会看到最后的结果。 ? 在一年后对整个模式的周围进行操作。

    ^    # 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
    
        4
  •  2
  •   PatrikAkerstrand    17 年前

    好吧,让我们为你把这个分开:

    • '~^(\d\d\d\d)(-(\d 1,2)(-(\d 1,2))?)$~
    • ~ -在开头和结尾是regexp分隔符,因此它们实际上不是正则表达式的一部分。
    • ^ -手段 “这是行首”
      • 避免在字符串中间匹配,并将其锚定,以便字符串的开头必须匹配
    • (\d\d\d) -匹配(和捕获)四位数字,并且不是可选的
      • 这也可以写成 \d{4 }
    • (-(\d 1,2)(-(\d 1,2))?)? -匹配(并捕获)可选组。
      • 它表示如果这个组存在,它必须是一个破折号,后跟一个或两个数字(天或月),后跟一个破折号,后跟一个或两个数字(天或月)。
    • $ -表示字符串的结尾,因此,与字符串开头的^一起表示整个字符串必须与regexp匹配。

    此regex将匹配的一些示例:

    • 1982—08-11
    • 1982~30—01
    • 8127—99—52

    一些不匹配的示例:

    • 82-08-11
    • 2009-10

    如您所见,这个regex将接受一些不是真正有效日期的“日期”,因此我可能也会通过某种日期处理函数来运行它,例如 strtotime .