PHP preg_match yyyy-mm-dd

时间:2014-01-11 16:37:11

标签: php regex


我需要一些正则表达式的帮助。我正在尝试验证字符串是否看起来像'yyyy-mm-dd',这是我到目前为止的代码:

case "date":
                if (preg_match("/^[0-9\-]/i",$value)){
                    $date = explode("-",$value);
                    $year = $date[0];
                    $month = $date[1];
                    $day = $date[2];
                    if (!checkdate($month,$day,$year))
                    {
                        $this->errors[] = "Ogiltigt datum.";
                    }
                } else {
                    $this->errors[] = "Ogiltigt datum angivet.";
                }
            break;

我对正则表达式很陌生,谢谢。

3 个答案:

答案 0 :(得分:8)

您可以使用:

if ( preg_match('/^[0-9]{4}-[0-9]{2}-[0-9]{2}\z/', $value) ) { ...

然而,这种模式可以验证类似0000-40-99

的内容

模式细节:

/         # pattern delimiter
^         # anchor: start of the string
[0-9]{4}  # four digits
-         # literal: -
[0-9]{2}
-
[0-9]{2}
\z        # anchor: end of the string
/         # pattern delimiter

答案 1 :(得分:2)

使用capturing group,您无需拨打explode

if (preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $value, $matches)) {
    $year = $matches[1];
    $month = $matches[2];
    $day = $matches[3];
    ...
}
  • \d匹配任何数字字符。
  • {n}是量词:恰好与之前的模式匹配4次。
  • 您可以使用$matches[1]$matches[2],...来访问匹配的群组
    • $matches[0]包含完整匹配的字符串。

答案 2 :(得分:0)

虽然你可以使用正则表达式,但也可以使用一个简单的函数来根据瑞典格式(yyyy-mm-dd)或任何其他格式验证日期。

function validateDate($date, $format = 'Y-m-d H:i:s') {
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) == $date;
}

var_dump(validateDate('2014-01-11', 'Y-m-d')); // true
var_dump(validateDate('2014-1-11', 'Y-m-d')); // false

函数已从此answerphp.net

复制