PHP验证日期

时间:2014-02-28 20:38:41

标签: php date

我试图在$ immerseusnorm中验证YYYY-MM-DD中的日期我已经尝试了下面的代码,但它返回No!

<?php
$json = file_get_contents("http://www.wowtrack.org/plugins/guild/EU/Emerald%20Dream/VII?format=json", true);
$decode = json_decode($json, true);
$realmrank = " ". $decode[realmRank] ."";
$immerseusnorm = " ". $decode[encounters][0][completedOn]."";

if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$immerseusnorm))
{
$immerseusnorm = "Yes";
}
$immerseusnorm = "No";

echo "Realm Rank: $realmrank<br \>";
echo "Immerseus Normal - Completed On: $immerseusnorm<br \>"

任何帮助都会很棒

由于

3 个答案:

答案 0 :(得分:2)

我会尝试根据格式创建一个DateTime对象。这样,您可以验证格式和它建议的日期是否有效。例如,与您的模式匹配的简单正则表达式将允许类似2014-02-31的内容,这显然不是有效日期。

DateTime的唯一挑战是像2014-02-31这样的日期被“修复”到2014-03-03,而不是从DateTime::createFromFormat()返回false。因此,您只需检查输入字符串,以确保日期不会更改。

将它放入函数中可能如下所示:

function validate_date($input_date, $format = 'Y-m-d') {
    $datetime = DateTime::createFromFormat($format, $input_date);
    if(false === $datetime) {
        return false;
    } else if ($datetime->format($format) === $input_date) {
        return true;
    } else {
        return false;
    }
}


// usage
if (validate_date($immerseusnorm)) {
    // validation passed
} else {
    // validation failed
}

答案 1 :(得分:1)

我猜你应该在第二个$ immerseusnorm附近添加其他内容,它现在总是将其设置为no。所以更好地改变这个:

if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$immerseusnorm))
{
$immerseusnorm = "Yes";
}
$immerseusnorm = "No";

为:

if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$immerseusnorm))
{
    $immerseusnorm = "Yes";
}else{
    $immerseusnorm = "No";
}

答案 2 :(得分:0)

看来你的正则表达式正在发挥作用 你在这里错过了一点。  这一行总是执行:

$immerseusnorm = "No";

您的else条件应该if

试试这个:

if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$immerseusnorm))
{
$immerseusnorm = "Yes";
}
else{
$immerseusnorm = "No";
}

示例演示:请参阅演示:https://eval.in/107333