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>
路人 2017-05-14 20:00:48

怪怪的