【问题标题】:ICU: Transliterate and then remove all non-alphanumeric charactersICU:音译然后删除所有非字母数字字符
【发布时间】:2014-09-18 09:10:47
【问题描述】:

是否可以在 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 调用来做所有事情吗?

【问题讨论】:

  • 只有 50 个?这个问题让我大吃一惊,然后才 50?让它 200 .....
  • @UltraDEVV 我怀疑提高赏金会增加知道答案的程序员数量;)
  • 不知道这是否仍然相关,但您可以在规则集中指定一个字符类:'Any-Latin; Latin-ASCII; [^A-Za-z0-9_] Remove;'

标签: php icu transliteration


【解决方案1】:

为工作使用正确的工具

我看不出你现在所做的有什么问题。

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

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

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

当然,我已经为您的问题寻找了解决方案。但老实说,我找不到适用于所有可能输入的东西。

例如,并非所有字符(我们认为标点符号)都被[:Punctuation:] Remove; 删除。试试俄语名称:Корнильев, Кирилл。应用您的id 后,它变为:Kornilʹev Kirill。显然这不是标点符号,但您不希望在文件名中使用它。

所以我建议使用正确的工具来完成这项工作:

  1. 使用 ICU 获得最佳的 ASCII 等效项。仅将Latin-ASCII; 用作id 即可。漂亮而简单。
  2. 然后像以前一样使用正则表达式,确保只剩下所需的字符。

这确实没什么问题。

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

【讨论】:

  • 您能否解释一下,为什么 [:Punctation:] 不包括 PUNCTUATION 类别中的引号和撇号?
  • @wtorsi 这是对此答案的评论,还是新问题?在我看来,似乎是后者。在这种情况下,最好提出一个新问题。如果您这样做,请不要忘记记录您的陈述。
猜你喜欢
  • 1970-01-01
  • 2012-07-04
  • 2011-10-22
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 2021-09-10
  • 2013-01-19
相关资源
最近更新 更多