preg_match用于mysql日期格式

时间:2011-02-28 17:10:04

标签: php mysql regex string preg-match

我试图验证日期以查看它是否与mysql格式匹配

这是代码

$match = "/^\d{4}-\d{2}-\d{2} [0-2][0-3]:[0-5][0-9]:[0-5][0-9]$/";

    $s = $this->input->post("report_start"). " " . $this->input->post("report_start_time").":00";
    $e = $this->input->post("report_end"). " " . $this->input->post("report_end_time").":59";

    if($this->input->post("action") != "")
    {
        echo trim($s). " => " . preg_match($match, trim($s));
        echo "<br>";
        echo trim($e). " => " . preg_match($match, trim($e));
}

日期格式为$ s,$ e为

$s = 2011-03-01 00:00:00
$e = 2011-03-01 23:59:59

并且它们都返回false(0)。

我在http://www.spaweditor.com/scripts/regex/index.php上测试了模式,它返回true(1)

http://pastebin.com/pFZSKYpj

但是,如果我手动将日期字符串插入到preg_match中

preg_match($match, "2011-03-01 00:00:00")

它有效。

我不知道我做错了什么

======================

现在我考虑一下,我只需要验证日期时间字符串的最后部分。

我手动添加秒,日期由日期选择器强制,用户无法编辑它

7 个答案:

答案 0 :(得分:1)

小心:

[0-2][0-3]对于小时值不是一个好的正则表达式 - 它会与011223和其他人匹配,但它会通过04失败091419

更好地使用(2[0-3]|[01][0-9])

答案 1 :(得分:1)

你正在努力使你的工作变得更加困难。在PHP中有许多日期处理函数,这意味着您不必像字符串一样处理日期。因此,不要测试您的输入日期是否格式正确,只需坚持正确的格式:

$adate= date_create('January 6, 1983 1:30pm'); //date format that you don't want
$mysqldate= $adate->format("Y-m-d h:i:s");//date format that you do want

还有一些功能可以检查日期是否为实际日期,例如checkdate

答案 2 :(得分:1)

好的,我做了。 因为我强迫日期格式和时间部分的结束秒

我刚用"/^2[0-3]|[01][0-9]:[0-5][0-9]$"验证了小时:迷你部分; 如果返回true,我将所有内容放在一起,重新构建最终的日期时间字符串

    $match = "/^2[0-3]|[01][0-9]:[0-5][0-9]$/";

    $s_d = $this->input->post("report_start");
    $s_t = $this->input->post("report_start_time");
    $e_d = $this->input->post("report_end");
    $e_t = $this->input->post("report_end_time");

    if($this->input->post("action") != "")
    {


        if(
            ( preg_match($match , trim($s_d." ".$s_t.":00")) )
         && ( preg_match($match , trim($e_d." ".$e_t.":59")) )
         )
         {

            $r = $this->model_report->client_hours_logged(array($s,$e));
            $data['report'] = $r;
            var_dump($r);
            //$this->load->view("report/client_hours_per_client",$data);
         }
    }

答案 3 :(得分:0)

您可以使用strtotimedate来正确解析和格式化日期。

答案 4 :(得分:0)

为什么不简单地将日期强制为您想要的格式:

$e = '2011-03-01 00:00:00';
$mysqlFormat = date('Y-m-d H:i:s', strtotime($e));

此外,正则表达式中存在一些错误[0-2][0-3]:[0-5][0-9]:[0-5][0-9]只会匹配00,01,02,03,10,11,12,13,20,21,22,23的小时数,因此它将永远不会与凌晨4点或下午3点相匹配。除此之外,我查看了您的RegEx,我认为它与您提供的测试用例相匹配没有任何问题。我会检查以确保日期字符串两侧没有额外的空格和trim()。

答案 5 :(得分:0)

我同意Tim的观点:MySQL的行为处于怪癖模式,并且总是试图在DATE和DATE_TIME列类型上轻松实现。您可以省略输入的某些部分,它仍会尝试在某种程度上成功补偿并实现该目标...这就是为什么,您的Reg-ex认为无效的大多数数字,MySQL将接受为有效。

答案 6 :(得分:0)

我用它来验证'Y-m-d H:i:s'格式日期字符串:

match = '/^[12][0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[01]) ([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/';