2014-02-28 111 views
-1

我嘗試驗證的YYYY-MM-DD的日期在$ immerseusnorm我曾嘗試下面的代碼,但它沒有返回!PHP驗證日期

<?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

不該有的破折號像'正則表達式進行轉義\ -'? –

+0

前綴空間不在正則表達式中...可以這樣嗎? ** HTTP的 – barvaz

+0

可能重複://stackoverflow.com/a/12323025/67332** –

回答

1

我想你應該添加其他圍繞第二$ immerseusnorm,現在總是將其設置爲無。因此,更好地改變這樣的:

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"; 
} 
+0

您可能需要指出的區別是什麼,爲什麼它是不同 –

+0

你說得對,我加入了一些介紹。猜測從縮進中可以清楚看到。由於某種原因,在使用'$ immerseusnorm =「」之後出現了 –

+0

。 $解碼[遭遇] [0] [completedOn] 「」; 如果(的preg_match(「/^[0-9] {4} - (0 [1-9] | 1 [0-2]) - (0 [1-9] | [1-2] - [O- 9] | 3 [0-1])$ ​​/」,$ immerseusnorm)) { $ immerseusnorm = 「是」; }其他{$ = immerseusnorm 「否」; }'我仍然沒有得到,如果我使用它沒有代碼,我得到'2013-09-11' – ids

0

看來你的正則表達式工作。
你在這裏錯過了點。 該行始終執行:

$immerseusnorm = "No"; 

你應該有你的if條件else

試試這個:

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

+0

仍然是相同的輸出恐怕 – ids

+0

IM困惑我想這可能是什麼,如果我進入我自己的JSON做迄今爲止,它是響應 – ids

+0

@ids:看演示:https://eval.in/107333 –

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 
} 
+0

我不建議在比較格式化部分使用相同的比較操作,因爲對於一個例子,用戶可以輸入像'validateDate整數(2014 ,'Y')';在這種情況下'false'將被返回。 **(HTTP [和該函數可以簡化爲2行,這樣。]://計算器。com/a/12323025/67332)** –

+0

@Glavić我絕對會使用相同的操作符。事實上,如果我在生產中使用這個函數,我會強制字符串輸入,如果輸入不是字符串輸入,我會拋出一個異常。請注意,'createFromFormat()'方法需要字符串作爲日期的輸入。是的,這個功能可以摺疊下來,但是對於最短的代碼沒有獎勵積分。爲了演示目的,我想確保這個例子顯然是可以理解的。 –