作者jh961202 (阿電)
看板PHP
標題[請益] 處裡檔案中的字串
時間Fri Feb 7 17:22:07 2014
各位好,不知道這個標題下得好不好
但是,我大概先敘述一下我的程式要做甚麼,以及碰到的問題
=============================
這是一個可以瀏覽並且播放音樂的網站
網頁端的PHP程式會先去找檔案清單(實際上是一個文字檔),內有檔名和連結
當然,也有可能還會有子資料夾
而當發現是一個音樂(MP3)檔時,會要求要開在新視窗,否則就在原視窗開啟就好
光看上面的說明可能不太清楚,所以下面附上Input檔案範例
(但是實際檔案內容不包含後面的註解)
Input檔案範例一:
Songs
// 這是音樂清單的開頭指標
第一首歌
play.php?file=music1
第二首歌
play.php?file=music2
End_List
// 清單結尾標示
//Input至此結束,不含換行
小說明:play.php是播放器頁面,必須開在新視窗
而Output必須是:(以HTML原始碼呈現)
<a href =
play.php?file=music1 target="_blank">
第一首歌</a>
<a href =
play.php?file=music2 target="_blank">
第二首歌</a>
Input範例二:
Folder
// 資料夾清單開頭指標
第一個資料夾
list.php?list=2 // list.php就是這個網頁自己,他會列出一張檔案與資料夾的清單
End_List
Songs
第一首歌
play.php?file=music1
End_List
//Input至此結束,不含換行
Output必須是:
<a href =
list.php?list=2 >
第一個資料夾</a>
<a href =
play.php?file=music1 target="_blank">
第一首歌</a>
=================================================
以下是負責判斷清單類別,並且印出需要的HTML code的程式部分:
<?
$fp = fopen( "db/list_".$_GET['mid'].".txt", "r+" ) ;
$temp = fgets( $fp ) ;
// 取得第一張清單的類型
if ( strcmp($temp, "Folder") == 0 ) {
// 發現子資料夾清單
echo( "請選擇一項類別繼續瀏覽:<br>" );
$linkname = fgets( $fp ) ;
// 讀進第一位
while( strcmp( $linkname, "End_List" ) != 0 ) {
// 清單還沒結束就一直讀
$link = fgets( $fp ) ;
?>
<a href = "<? echo($link) ; ?>&title=<? echo($linkname) ; ?>" ><?
echo($linkname) ; ?></a><br>
<?
$linkname = fgets( $fp ) ;
// 下一位!
}
// while
$temp = fgets( $fp ) ;
// 既然有資料夾清單,那有歌曲的清單嗎?
if ( strcmp($temp, "Songs" ) == 0 ) {
// 有歌曲清單耶!
echo( "或者,選擇一首歌曲播放:<br>" );
$linkname = fgets( $fp ) ;
// 讀進第一位
while( strcmp( $linkname, "End_List" ) != 0 ) {
// 清單還沒結束就一直讀
$link = fgets( $fp ) ;
?>
<a href = "<? echo($link) ; ?>&title=<? echo($linkname) ; ?>"
target="_blank"><? echo($linkname) ; ?></a><br>
<?
$linkname = fgets( $fp ) ;
// 下一位!
}
// while
}
// if 有歌單
}
// if 有資料夾&歌單
else if ( strlen($temp) == 10 ) {
// 只發現歌曲清單
echo( "請選擇一首歌曲播放:" );
$linkname = fgets( $fp ) ;
// 讀進第一位
while( strcmp( $linkname, "End_List" ) != 0 ) {
// 清單還沒結束就一直讀
$link = fgets( $fp ) ;
?>
<a href = "<? echo($link) ; ?>&title=<? echo($linkname) ; ?>"
target="_blank"><? echo($linkname) ; ?></a><br>
<?
$linkname = fgets( $fp ) ;
// 下一位!
}
// while
}
// else if
// 歌單處理結束
}
// if
else {
echo("<center>本區域測試中,尚未開放,敬請拭目以待</center>") ;
}
// else
?>
=====================================================
這程式的迴圈都會work,strcmp基本上也都沒有問題
但是很奇怪的是,只要從檔案讀出來,Songs長度會變成10(不是應該是5嗎?)
而Folder這個字串的長度則會變成12(不是應該是6嗎?)
所以造成無法進入迴圈,想當然爾,網頁上就是空白一片了
本來想說是不是有藏什麼字元,於是有嘗試加上trim()函式,但是結果一樣...
有任何人可以幫忙解答嗎?感激不盡!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.250.127.134
1F:推 LPH66:檢查輸入檔的編碼 照敘述看似乎是 UTF-16... 02/07 17:24
2F:推 s25g5d4:直接讀檔名開檔喔 感覺就超危險的阿 02/07 17:58
3F:推 alog:開檔案前先做escape,不然你那個$_GET可以惡搞 02/07 18:00
不好意思,複製code的時候少複製一行:
if ( file_exists( "db/list_".$_GET['mid'].".txt" ) ) {
所以~這是有做前置處裡的(只要找不到檔案就顯示一組訊息,並且不會繼續執行)
抱歉造成各位誤會~
4F:推 alog:另外資料的交換都統一使用UTF-8 這比較不易出問題 02/07 18:02
6F:推 alog:音樂歌曲易有日韓簡體,建議用mbstring 來處理字串 02/07 18:04
※ 編輯: jh961202 來自: 111.250.127.134 (02/08 00:31)
7F:→ alog:filename 基本上要 escape / \ . 這三個字元 02/08 02:23
8F:→ alog:建議養成習慣,不要把 $_GET or $_POST 之類的參數 02/08 02:26
9F:→ alog:直接用在 function 上 02/08 02:26
10F:→ alog:你可以這樣 music_filename = 跳脫("{$music_id}.txt"); 02/08 02:27
11F:→ alog:不僅好讀、好維護,之後要修正也比較好替換 02/08 02:28
不管置換成哪一種編碼方式都沒有用...
(網頁本身是UTF-8,確定每一個文件也都是UTF-8,甚至還試過ANSI...)
另外,範例中的Songs長度不是顯示10,而是7
(多兩個字元,到底是誰啊OAO)
而Folder換成Subfolder會變成13個字元...
(竟然多了4個字元...完全沒有規律阿0.0)
※ 編輯: jh961202 來自: 111.250.127.134 (02/08 20:18)