在哪里可以找到PHP transliterator(Intl)的ID或规则列表?

时间:2013-05-19 14:41:43

标签: php transliteration intl

Transliterator::listIDs()会列出ID,但显然它不是完整列表。

example from this page中,ID如下所示:

Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC; [:Punctuation:] Remove; Lower();

这有点奇怪,因为ID应该是唯一的。这看起来更像一条规则,但如果我将其传递给createFromRules方法则不起作用:)

无论如何,我正在尝试删除字符串中的任何标点符号,除了破折号(-)或特定列表中的字符。

你知道这是否可能?或者是否有一些文档更好地解释了音译器的语法?

2 个答案:

答案 0 :(得分:3)

Transliterator::listIDs()是“基本ID”的ID。您给出的示例是“复合ID”。您可以看到ICU docs on this

您还可以使用Transliterator::createFromRules()创建自己的规则。

您可以查看预先定义的规则(用您的ICU版本替换48):

<?php
$a = new ResourceBundle(NULL, 'icudt48l-translit', true);

foreach ($a['RuleBasedTransliteratorIDs'] as $name => $v) {
    $file = @$v['file'];
    if (!$file) {
        $file = $v['internal'];
        echo $name, " (direction $file[direction]; internal)\n";
    } else { 
        echo $name, " (direction: $file[direction])\n";
        echo $file['resource'];
    }
    echo "\n--------------\n";
}

格式化后,结果看起来像this

答案 1 :(得分:1)

以防万一有人想要一个可行的例子。提到的示例(来自php手册)使用过程样式。要使其使用面向对象的样式,请使用create()代替createFromRules()

removePunctuation($string) {
    $transliterator = Transliterator::create("Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC; [:Punctuation:] Remove;", \Transliterator::FORWARD);

    return $transliterator->transliterate($string);
}