2017-02-21 66 views
1

我有一個可以上傳文件的webform。要替換特殊字符我用戶提供以下功能:替換字符`不起作用

function createSafeFilenameForQuestion($filename){ 
    $filename = str_replace(" ", "_", $filename); 
    $search = array("ä", "ö", "ü", "ß", "Ö", "Ä", "Ü"); 
    $replace = array("ae","oe","ue","ss","Oe","Ae","Ue"); 
    $ret = str_replace($search, $replace, $filename); 
    $in_charset = mb_detect_encoding($filename); 
    $ret = iconv($in_charset, 'US-ASCII//TRANSLIT', $ret); 
    $ret = preg_replace("/\s/i", "_", $ret); 
    $ret = preg_replace("/[^0-9a-z_\.]/i", "", $ret); 
    $filename = mb_strtolower($ret); 
    return $filename; 
} 
createSafeFilenameForQuestion("ä#`´+4`32 _.png"); 

我的問題是,這個代碼工作正常,我的本地機器上用PHP 5.2.5,它不會在服務器上使用PHP 5.2.0工作。

local output: aeae432__.png 
server output: ae 

看來,字符´是問題所在。

+1

服務器是否已經安裝了MBSTRING擴展。? – apokryfos

+2

'mb_detect_encoding()'不符合你的想法。其實基本上沒用。此外,同時執行'iconv($ in_charset,'US-ASCII // TRANSLIT',$ ret);'和手動替換是多餘的。 ///無論如何,我的提示是不關心文件的原始名稱。自己指定一個,可能是一個隨機的,然後在下載頭文件中使用原始名稱。 –

回答

0

mbstring被安裝並啓用。但正如Álvarao所說,使用iconv($in_charset, 'US-ASCII//TRANSLIT', $ret);是沒有必要的。我刪除了該行,現在它工作。

function createSafeFilenameForQuestion($filename){ 
    $filename = str_replace(" ", "_", $filename); 

    $search = array("ä", "ö", "ü", "ß", "Ö", "Ä", "Ü"); 
    $replace = array("ae","oe","ue","ss","Oe","Ae","Ue"); 
    $ret = str_replace($search, $replace, $filename); 

    $ret = preg_replace("/\s/i", "_", $ret); 
    $ret = preg_replace("/[^0-9a-z_\.]/i", "", $ret); 
    $filename = mb_strtolower($ret); 
    return $filename; 
} 

輸入:AA號''+ 4`32 _.png
輸出:ae432 __ PNG

0

請確保您的服務器上安裝了mbstring擴展程序,以檢查是否可以使用phpinfo();創建一個php文件,然後運行它以查看是否安裝/加載了mbstring

如果沒有安裝它,你可以通過運行followinng命令安裝:

apt-get install php5-mbstring

service apache2 restart

並使其運行:

sudo phpenmod mbstring

這應該可以解決問題。

但如果你是共享託管服務器上,那麼你將需要聯繫託管支持,使之...