[請益] 處裡檔案中的字串

看板PHP作者 (阿電)時間10年前 (2014/02/07 17:22), 編輯推噓5(506)
留言11則, 3人參與, 最新討論串1/1
各位好,不知道這個標題下得好不好 但是,我大概先敘述一下我的程式要做甚麼,以及碰到的問題 ============================= 這是一個可以瀏覽並且播放音樂的網站 網頁端的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

02/07 17:24, , 1F
檢查輸入檔的編碼 照敘述看似乎是 UTF-16...
02/07 17:24, 1F

02/07 17:58, , 2F
直接讀檔名開檔喔 感覺就超危險的阿
02/07 17:58, 2F

02/07 18:00, , 3F
開檔案前先做escape,不然你那個$_GET可以惡搞
02/07 18:00, 3F
不好意思,複製code的時候少複製一行: if ( file_exists( "db/list_".$_GET['mid'].".txt" ) ) { 所以~這是有做前置處裡的(只要找不到檔案就顯示一組訊息,並且不會繼續執行) 抱歉造成各位誤會~

02/07 18:02, , 4F
另外資料的交換都統一使用UTF-8 這比較不易出問題
02/07 18:02, 4F


02/07 18:04, , 6F
音樂歌曲易有日韓簡體,建議用mbstring 來處理字串
02/07 18:04, 6F
※ 編輯: jh961202 來自: 111.250.127.134 (02/08 00:31)

02/08 02:23, , 7F
filename 基本上要 escape / \ . 這三個字元
02/08 02:23, 7F

02/08 02:26, , 8F
建議養成習慣,不要把 $_GET or $_POST 之類的參數
02/08 02:26, 8F

02/08 02:26, , 9F
直接用在 function 上
02/08 02:26, 9F

02/08 02:27, , 10F
你可以這樣 music_filename = 跳脫("{$music_id}.txt");
02/08 02:27, 10F

02/08 02:28, , 11F
不僅好讀、好維護,之後要修正也比較好替換
02/08 02:28, 11F
不管置換成哪一種編碼方式都沒有用... (網頁本身是UTF-8,確定每一個文件也都是UTF-8,甚至還試過ANSI...) 另外,範例中的Songs長度不是顯示10,而是7 (多兩個字元,到底是誰啊OAO) 而Folder換成Subfolder會變成13個字元... (竟然多了4個字元...完全沒有規律阿0.0) ※ 編輯: jh961202 來自: 111.250.127.134 (02/08 20:18)
文章代碼(AID): #1IzAN2yQ (PHP)