可以用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音译首先是语言导向.它试图保持意义.
另一方面,正则表达式可以详细操作字符,从而确保文件名仅限于所选字符.
在这种情况下,这种组合是完美的.
当然,我已经找到了解决问题的方法.但说实话,我找不到适用于所有可能输入的东西.
例如,并非所有字符,我们都会考虑标点符号,被[:标点符号:]删除;请尝试俄语名称:Корнильев,Кирилл.申请你的身份后,它变成了:Kornil’ev Kirill.显然,这不是标点符号,但您不希望它在您的文件名中.
所以我建议使用正确的工具:
>使用ICU获得最佳ASCII参数.仅使用Latin-ASCII;正如id会做的那样.很好,很简单.
>然后使用正则表达式,就像你一样,确保你只剩下你需要的字符.
这真的没有错.
PS:就我个人而言,我认为编写ICU用户指南的人或人员不应该对做得好的工作表示赞赏.真是一团糟.