我试图在$ 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 \>"
任何帮助都会很棒
由于
答案 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