【问题标题】:replace character ` doesn't work替换字符`不起作用
【发布时间】:2017-07-10 19:47:50
【问题描述】:

我有一个网络表单,您可以在其中上传文件。要替换特殊字符,我使用以下函数:

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

看来,字符´ 是问题所在。

【问题讨论】:

  • 服务器是否安装了mbstring扩展?
  • mb_detect_encoding() 不会按照你的想法去做。其实基本没用。此外,同时进行iconv($in_charset, 'US-ASCII//TRANSLIT', $ret); 和手动替换是多余的。 /// 无论如何,我的建议是根本不关心文件的原始名称。自己分配一个,可能是一个随机的,并在下载标题上使用原始名称。

标签: php regex php-5.2


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    如果没有安装,你可以通过运行以下命令来安装它:

    apt-get install php5-mbstring

    service apache2 restart

    并让它运行:

    sudo phpenmod mbstring

    这应该可以解决问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 2016-02-15
      • 2016-10-05
      • 2012-07-08
      • 2011-08-12
      相关资源
      最近更新 更多