2017-02-21 56 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

这应该可以解决问题。

但如果你是共享托管服务器上,那么你将需要联系托管支持,使之...