3

Transliterator::listIDs()将列出 ID,但显然它不是一个完整的列表。

此页面的示例中,ID 如下所示:

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

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

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

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

4

2 回答 2

5

作为Transliterator::listIDs()“基本 id”的 id。您给出的示例是“复合 ID”。您可以在此查看 ICU 文档

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

您可以查看预定义的规则:

<?php
$a = new ResourceBundle(NULL, sprintf('icudt%dl-translit', INTL_ICU_VERSION), 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";
}

格式化后,结果如下所示

于 2013-06-09T23:08:33.063 回答
1

以防万一有人想要一个工作示例。提到的示例(来自 php 手册)使用程序样式。要使其适用于面向对象的风格,请使用create()而不是createFromRules()

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

    return $transliterator->transliterate($string);
}
于 2020-06-14T13:00:39.630 回答