Php ICU:音译,然后删除所有非字母数字字符

Php ICU:音译,然后删除所有非字母数字字符,php,icu,transliteration,Php,Icu,Transliteration,在不回到regex的情况下,可以通过ICU完成吗 目前我规范化文件名,如下所示: protected function normalizeFilename($filename) { $transliterator = Transliterator::createFromRules( 'Any-Latin; Latin-ASCII; [:Punctuation:] Remove;' ); $filename = $transliterator->tra

在不回到regex的情况下,可以通过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调用吗?

使用正确的工具完成此任务 我看不出你现在做的有什么不对

ICU音译首先是面向语言的。它试图保留意义

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

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

当然,我一直在寻找解决你问题的办法。但老实说,我找不到对所有可能的输入都有效的东西

例如,并不是所有的字符,我们都会考虑标点符号,通过<代码> [标点::]删除;代码>。试试俄文名称:

kerkццц,kerkццц
。应用
id
后,它将变成:
Kornilʹev Kirill
。很明显,这不是标点符号,但您不希望它出现在文件名中

因此,我建议在工作中使用正确的工具:

  • 使用ICU获得最佳ASCII等效值。仅使用
    拉丁ASCII
    id
    所示。又好又简单
  • 然后使用正则表达式,就像您所做的那样,确保只剩下所需的字符
  • 这真的没什么错


    附言:就个人而言,我认为撰写ICU用户指南的人不应该因为工作出色而受到赞扬。真是一团糟

    只有50岁?这个问题会让人大吃一惊,然后才50岁?让它变成200…@Ultradev我怀疑提高奖金会增加知道答案的程序员的数量;)不知道这是否仍然相关,但您可以在规则集本身中指定字符类:
    'Any-Latin;拉丁ASCII码;[^A-Za-z0-9]拆除;'