Month: December 2011

PHP: Using explode() with seperator “\n”

Posted by – December 26, 2011

有個以 PHP 開發的案子在測試階段回報有 bug,雖然兇手不是我,但還是去了解一下。原來的程式是讓使用者輸入多個 Youtube 影片網址,然後由程式取出每一支影片的 uid,封裝成陣列後回傳。之後的程式會取出 uid,然後在網站上 show 出 Youtube 影片。不過當使用者輸出多支影片的網址後,只有最後一支影片會出現,前面的都錯誤了。

原程式是這樣寫的...

<?php
//使用者輸入的影片網址. http://後面空一格是避免Wordpress把影片顯示出來
$youtube = <<<EOF
http:// www.youtube.com/watch?v=SAIEamakLoY
http:// www.youtube.com/watch?v=MhVp9gcxLJY
http:// www.youtube.com/watch?v=OxzucwjFEEs
EOF;

function get_youtube_hash($youtube){
    $hash = array();
    $youtube = explode("\n", $youtube);

    foreach($youtube as $y){
        $youtube_qs = parse_url($y, PHP_URL_QUERY);
        $youtube_qv = explode('&', $youtube_qs);

        foreach($youtube_qv as $key => $value){
            list($k, $v) = explode('=', $value);
            if($k == 'v') $hash[] = $v;
        }
    }

    if(empty($youtube)) return FALSE;
    else return $hash;
}
echo "<pre>";
print_r( get_youtube_hash( $youtube ) );
echo "</pre>";
?>

result:
Array
(
    [0] => SAIEamakLoY_
    [1] => MhVp9gcxLJY_
    [2] => OxzucwjFEEs
)

從輸出的結果可以發現除了最後一筆資料,其他的結尾都多了一個底線 ( _ )。

不難猜到是第 11 行的問題。用 \n 當截斷字元,有可能會留下看不見的 \r 字元。下一步 parse_url 又將所有不合法字元替換成底線,後面就一路錯下來了。

解決方法有兩種,一是把第 11 行改為

$youtube = explode(PHP_EOL, $youtube); //PHP_EOL可以跨平台, Windows, Linux, MacOS

二是把第 14 行 parse_url 的內容改為

$youtube_qs = parse_url(trim($y), PHP_URL_QUERY);

如此一來就可以得到正確的影片 uid 陣列了。

jQuery: Check if Element is Visible or Hidden

Posted by – December 23, 2011

用 jQuery 編寫網頁效果時經常需要檢查網頁元素 (element) 的狀態,像是可見 ( visible ) 或是隱藏 ( hidden )。

常見的寫法是

if( $(element).css('display') == 'block' )

或是

 if( $(element).css('display') == 'hidden' )

不過我一直覺得這兩種寫法很累贅,又萬一元素的顯示狀態不是 block,而是 inline-block 或是別的呢?在翻閱 jQuery 文件時想到一個更便捷的用法,用 is 來檢查元素狀態即可。

$(element).is(":visible")

回傳值是 true or false,更方便。

if( $('#foo').is(':visible') ) {
    // it's not hidden, do something
}
else {
    // it's hidden so do something else
}

How to Convert String to Slug

Posted by – December 20, 2011

在這個 SEO 當道的年代,簡單易懂的現代網址已經是基本常識了。根據 W3C 的網址規定,合法字元僅有 A - Z, a - z, 0 - 9, -, ., _, ~, :, /, ?, #, [, ], @, !, $, &, ', (, ), *, +, ,, ;  = ,而且橫線 ( - ) 之後都是有特別意義的保留字,所以過去常看到亂七八糟的亂碼網址,像是本文的標題不處理的話就變....

How%20to%40%20Convert%20String%20to%20Slug

雖然對電腦來說沒什麼差別,但是對人類來說卻是難以理解、難以記憶的無意義片段。 More

CSS: How To Use @font-face

Posted by – December 17, 2011

過去在開發網站時,字體的選擇一直都很保守,因為每個瀏覽器與作業系統對字型的支援很有限,幾乎就那幾種安全字型可以用。不過自從 CSS 多了 @font-face 這個指令後,事情開始有了些微的變化。@font-face 允許設計師在 CSS 指定特殊別的字型,瀏覽器會根據設定去下載這個字型來顯示,就像 background-image: url('link/to/image'); 一樣,瀏覽器會下載背景圖來顯示。 More

Email Address Validation Using Regular Expression

Posted by – December 16, 2011

寫驗證規則最常碰到的就是 email 檢查,每次寫 Regular Expression 都要重新思考一下規則,覺得這樣太浪費時間了,直接寫個筆記給未來的自己複製貼上。

<?php

// 隨便寫幾個 email 來驗證規則
$mails = "someone@gmail.com, _apple@apple.com,
          ex@ex, some-body@gmail.com, NEXTstep@pchome.com.tw, test@nf.NL";
$mails = str_replace(' ', '', strtolower($mails)); // 轉成小寫並去除空白字元
$mails = explode(",",$mails); // 依逗號切斷,並存入陣列
$valid_mails = array();
foreach($mails as $mail){
    if(preg_match("/^[a-z]+[\w\d\.\-_]*@[\w\d-]+\.[\w\.]+[a-z]$/", $mail)){
        array_push($valid_mails, $mail);

        // 可以直接塞進 PHPMailer,省去 $valid_mails 變數
        $phpmailer->mail->AddBCC($mail, '');
    }
}

print_r($valid_mails);
?>

輸出結果如下,不合法的 email 被濾掉了
Array
(
    [0] => someone@gmail.com
    [1] => some-body@gmail.com
    [2] => nextstep@pchome.com.tw
    [3] => test@nf.nl
)

Configuring the PHP Environment With php.ini in Bluehost

Posted by – December 9, 2011

Bluehost Logo

Bluehost 允許網站管理者修改 php.ini,這是相當方便的功能。我開發了一個簡單的圖片空間網站 pic.qoding.us,在上傳檔案和處理縮圖上碰到了記憶體不足的問題,這時候就要靠修改 php.ini 來解決。 More