0

我正在尝试匹配 PHP 正则表达式中的特定日期时间格式:

dd-mm-YYYY HH:ii:ss

它应该始终采用这种格式。这意味着例如当它是该月的第一天时,必须有一个前导零。例如:

01-01-2013 01:01:01

我尝试了以下模式:

^[0-12]{2}-[0-31]{2}-[0-9]{4} [0-23]{2}:[0-59]{2}:[0-59]{2}$

但是上面的模式在时间戳上失败了,比如:09-05-2013 19:45:10.

http://rubular.com/r/eGBAhwiNCR

我知道这可能不是验证这样的日期时间的正确方法,但我真的很想知道上面有什么问题。

4

4 回答 4

7

[0-12]{2}不匹配0直到的数字12。相反,它是一个字符类01也允许数字2。随后的量词只允许那些重复,意味着 0,1 或 2 重复两次。

您的其他占位符遵循相同的无效方案。

最好求助于\d{2}或者\d{4}如果你不能用谷歌搜索更好的正则表达式。更好DateTime的是,只需用于验证格式。

于 2013-05-09T17:56:51.677 回答
1

问题是当您检查“范围”时,例如[0-12]在开始时。那是一个字符类,它告诉正则表达式匹配 0 到 1,然后是 2。因此,如果您在第一个之后添加了更多数字,它就不会像您预期的那样工作。稍微更改您的正则表达式(专注于[0-12]初始),[0-319]{2}-[0-12]{2}-[0-9]{4} [0-23]{2}:[0-59]{2}:[0-59]{2}$, 将匹配09-01-2011 11:11:10.

确保每个空间都有有效的数字需要跳出框框思考。正则表达式:

(0[1-9]|[12][\d]|3[0-2])-(0[1-9]|1[0-2])-[\d]{4} (0[1-9]|1[\d]|2[0-3]):(0[1-9]|[1-5][\d]):(0[1-9]|[1-5][\d])$

将使用您尝试的正则表达式来满足您的期望。

如果你把它分解成更小的部分,这是有道理的(一开始看起来真的很吓人)。查看第一部分(0-31 表示“天”)。

(0[1-9]|[12][\d]|3[0-2])

这是使用 or 来处理 3 种不同的情况。

  1. 0[1-9]- 一个 0 后跟 1-9 之间的任意数字。我们不想要[0-9]{2},因为这将允许像00. 因此,如果一个数字以开头0并在其后有任何其他数字(对于一位数天),则该数字是有效的。
  2. [12][\d]- a1 or 2后跟任意数字。这允许数字10-29有效。
  3. 3[0-2]-a3后跟任何0通过2匹配30,3132.

分解,这并不算太糟糕,但是随后会针对您约会中的每个“字段”执行此模式。所以这个正则表达式验证每个字段是否有效......但可能需要一种更好的方法来确认有效日期。 这不会涉及检查是否可以拥有的复杂性,30-02例如,2 月没有 30 天。

于 2013-05-09T17:58:53.710 回答
0
^[0-9]{2}-[0-9]{2}-[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}$
于 2013-05-09T17:55:31.703 回答
0

验证示例在 php 中,但正则表达式是标准的

/*pass the date you wanna validate as parameter to the function.
The function returns true if it is valid and false if the date passed is not valid
*/   
function DateValid($date){
    //format will be fr if the date is in french format and en if the date is in en format
    $format='';
    //regex that tests if the date is in french format or english, if not in one of these two then it is not valid
    if(preg_match("#^(\d{1,2})[\-./ ](\d{1,2})[\-./ ](\d{4})(?: (\d{1,2})(?:[ .-](\d{1,2})){1,2})?$#",$date,$m)){
        $format='fr';
    }elseif (preg_match('#^(\d{4})[-. ](\d{1,2})[-. ](\d{1,2})(?: (\d{1,2})(?:[ .-](\d{1,2})){1,2})?$#', $date, $m)) {
        $format='en';
    }else{
         echo '<p style="font-size:150px">not english nor french</p>';
        return false;
    }
    //If it is french format or English then check if the date is correct
     if($format=='fr'){
         if (checkdate($m[2], $m[1], $m[3]) == false || $m[4] >= 24 || $m[5] >= 60 || $m[6] >= 60) {
            echo '<p style="font-size:150px">Not valid french</p>';
            return false;
        }else{
             echo '<p style="font-size:150px">Valid french</p>';
             return true;
        }
     }elseif($format=='en'){
         if (checkdate($m[2], $m[3], $m[1]) == false || $m[4] >= 24 || $m[5] >= 60 || $m[6] >= 60) {
             echo '<p style="font-size:150px">Not valid english</p>';
             return false;
        }else{
            echo '<p style="font-size:150px">Valid english</p>';
            return true;
        }
     }
}
于 2015-06-29T22:26:12.743 回答