2013-04-02 23:27:55Morris
[PHP][作業] 日期使用&倒數
作業內容:
1.設計一表單可以輸入生日,並可選擇結果輸出是否要粗體、斜體、底線、及三種不同顏色,作頁限制一頁。
2.結果請顯示距離下次生日還剩下幾天。
3.請用正規表達式的字串檢查格式,來確認輸入的西元年月日是否正確無誤。
作業心得:
這次有幾點特別注意,正規表達式的使用,以及日期距離的計算。
正規表達式原本應該長成這樣 preg_match_all(regx, string, buffer[]) 這麼寫比較好,
正規語法真讓我十分錯愕,用 /.../ 為分隔,用 $ 結尾,用 ^ 開頭限制。
然後將答案存放在 buffer[0][0], buffer[0][1], buffer[0][2] ...
可以使用 count(buffer[0]) 得到其個數。
暫時用 sscanf 頂著吧,有空閒再做修改,反正俺也沒修這門課的。
checkbox 預設使用 checked = "checked"。
而如何抓取 checkbox 的值?它採用陣列形式的方式儲存 [0], [1], [2] ....
當初以為可以用 hash 直接抓,真是大錯誤。
接著是計算倒數的部分,這有些的問題,
getdate() 與 date("U") 似乎是不同的,
使用 mktime() 出來的變數,無法與 getdate() 做相減。
吶,計算下一次可能是隔年,又或者隔四年。
<html>
<head>
<title></title>
</head>
<body>
<form method="POST" action="hw4.php">
<?php
$pflag = true;
$yyyy = null;
$mm = null;
$dd = null;
if($_POST['str'] != null && preg_match("/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/", $_POST['str'], $matches)){
sscanf($_POST['str'], "%d-%d-%d", $yyyy, $mm, $dd);
if(checkdate($mm, $dd, $yyyy)) {
$pflag = false;
}
}
if($pflag) {
echo '請輸入你的生日:<input type="text" name="str"><br>';
echo '依照格式:yyyy-mm-dd EX:1990-05-05'.'<br>';
echo '文字樣式選擇:';
echo '<input type="checkbox" name="wtype[]" value="B"><label>粗體</label>';
echo '<input type="checkbox" name="wtype[]" value="I"><label>斜體</label>';
echo '<input type="checkbox" name="wtype[]" value="U"><label>底線</label><br>';
echo '文字顏色選擇:';
echo '<input type="radio" name="color" value="black" checked="checked">黑色';
echo '<input type="radio" name="color" value="blue">藍色';
echo '<input type="radio" name="color" value="red">紅色<br>';
echo '<input name="xx" type="submit" value="確認"/>';
echo '<input type="reset" value="清除"/>';
if($_POST['str'] != null)
echo '<br>格式錯誤';
} else {
$COLOR = $_POST['color'];
$STYLE = $_POST['wtype'];
$mark = array();
$mark[$STYLE[0]] = 1;
$mark[$STYLE[1]] = 1;
$mark[$STYLE[2]] = 1;
echo "<font color='$COLOR' size=20>";
if($mark['B'] == 1)
echo '<b>';
if($mark['I'] == 1)
echo '<i>';
if($mark['U'] == 1)
echo '<u>';
date_default_timezone_set('Asia/Taipei');
$now = date("U");
$next = null;
printf("你的生日為西元%d年%d月%d日<br>", $yyyy, $mm, $dd);
for($i = $yyyy; ; $i++) {
if(checkdate($mm, $dd, $i)) {
$end = mktime(0,0,0,$mm, $dd, $i);
$time = $end - $now;
$show = floor($time/60/60/24);
if($show < 0)
continue;
printf("距離下次生日還剩下%d天<br>", $show);
break;
}
}
if($mark['U'] == 1)
echo '</u>';
if($mark['I'] == 1)
echo '</i>';
if($mark['B'] == 1)
echo '</b>';
echo '</font>';
}
?>
</form>
</body>
</html>
上一篇:[PHP][作業] 陣列使用
下一篇:[HTML5][簡易] 流幕動畫
怪怪的