ICU:Transliterate然后删除所有非字母数字字符

时间:2014-09-18 09:10:48

标签: php icu transliteration

可以在不退回正则表达式的情况下使用ICU吗?

目前我正常化文件名,如下所示:

protected function normalizeFilename($filename)
{
    $transliterator = Transliterator::createFromRules(
        'Any-Latin; Latin-ASCII; [:Punctuation:] Remove;'
    );
    $filename = $transliterator->transliterate($filename);
    $filename = preg_replace('/[^A-Za-z0-9_]/', '', $filename);
    return $filename;

}

我可以在这里摆脱正则表达式并使用ICU调用做任何事情吗?

1 个答案:

答案 0 :(得分:9)

使用正确的工具

我没有看到你现在正在做的事情有什么问题。

ICU音译首先是语言导向。它试图保持意义。

另一方面,正则表达式可以详细操作字符,从而确保文件名仅限于所选字符。

在这种情况下,这种组合是完美的。

当然,我已经找到了解决问题的方法。但说实话,我无法找到适合所有可能投入的东西。

例如,[:Punctuation:] Remove;不会删除所有字符,我们会考虑标点符号。请尝试俄语名称:Корнильев, Кирилл。应用id后,它变为:Kornilʹev Kirill。很明显,这不是一个标点符号,但你不希望它在你的文件名中。

所以我建议使用正确的工具:

  1. 使用ICU获得最佳的ASCII等效。仅使用Latin-ASCII;作为id即可。很好很简单。
  2. 然后使用正则表达式,就像你一样,确保你只留下你需要的字符。
  3. 这没有什么不妥。

    PS:就我个人而言,我认为编写ICU用户指南的人或人不应该对做得好的工作表示赞赏。真是一团糟。

相关问题