替换字符`不工作

时间:2017-02-21 09:13:19

标签: php regex php-5.2

我有一个可以上传文件的网络表单。要替换特殊字符,我使用以下功能:

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

看来,角色´就是问题所在。

2 个答案:

答案 0 :(得分:0)

确保您的服务器上安装了mbstring扩展程序,以检查您是否可以使用phpinfo();创建一个php文件,然后运行它以查看是否已安装/加载mbstring

如果未安装,可以通过运行followinng命令安装它:

apt-get install php5-mbstring

service apache2 restart

并启用它:

sudo phpenmod mbstring

这应该解决问题。

但如果您在共享托管服务器上,那么您需要联系托管支持以启用它...

答案 1 :(得分: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;
}

输入:ää#`'+ 4`32 _.png
输出:ae432 __。png