有個以 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 陣列了。
Leave a Reply Cancel reply