可以在不退回正则表达式的情况下使用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调用做任何事情吗?
答案 0 :(得分:9)
我没有看到你现在正在做的事情有什么问题。
ICU音译首先是语言导向。它试图保持意义。
另一方面,正则表达式可以详细操作字符,从而确保文件名仅限于所选字符。
在这种情况下,这种组合是完美的。
当然,我已经找到了解决问题的方法。但说实话,我无法找到适合所有可能投入的东西。
例如,[:Punctuation:] Remove;
不会删除所有字符,我们会考虑标点符号。请尝试俄语名称:Корнильев, Кирилл
。应用id
后,它变为:Kornilʹev Kirill
。很明显,这不是一个标点符号,但你不希望它在你的文件名中。
所以我建议使用正确的工具:
Latin-ASCII;
作为id
即可。很好很简单。这没有什么不妥。
PS:就我个人而言,我认为编写ICU用户指南的人或人不应该对做得好的工作表示赞赏。真是一团糟。