gpt4 book ai didi

php - 从音译器转换中排除特定字符

转载 作者:行者123 更新时间:2023-12-04 14:58:01 27 4
gpt4 key购买 nike

我正在尝试使用 PHP 进行音译,但我需要的是转换所有非拉丁字符,但保留意大利重音字符 (àèìòù)。

PHP Transliterator 缺少文档和在线示例。我读过 ICU docs我知道有一条规则强制 Transliterator 将一个字符转换为我们指定的另一个字符 (à > b)。

代码(使用create函数)

$str = "AŠAàèìòù Chén Hǎi yáo München Faißt Финиш 国内 - 镜像";
$transliterator = Transliterator::create("Any-Latin; Latin-ASCII");
echo $transliterator->transliterate($str);

将所有非拉丁字符转换为拉丁字符(带有所有重音字符)并给出结果

ASAaeiou Chen Hai yao Munchen Faisst Finis guo nei - jing xiang

和代码(使用createFromRules函数)

$str = "AŠAàèìòù Chén Hǎi yáo München Faißt Финиш 国内 - 镜像";
$transliterator = Transliterator::createFromRules("á>b");
echo $transliterator->transliterate($str);

强制将 à 正确转换为 b,但很明显,没有转换 Any-Latin; Latin-ASCII 由前面的代码制作,给出结果

AŠAbèìòù Chén Hǎi ybo München Faißt Финиш 国内 - 镜像

所以我的目标是合并 Any-Latin; Latin-ASCII 转换和 à > à 规则(以及其他意大利重音元音),以便告诉 Transliterator 将所有非拉丁字符转换为拉丁字符,但将意大利重音元音转换为自己,结果如下:

ASAàèìòù Chen Hai yao Munchen Faisst Finis guo nei - jing xiang

有没有办法将 à>à 规则放在 create 函数的参数中或添加 Any-Latin; createFromRules 函数参数中的 Latin-ASCII 指令?

最佳答案

以你的输入和输出为例:

$transliterator = Transliterator::create("Any-Latin; Latin-ASCII");
$str = "AŠAàèìòù Chén Hǎi yáo München Faißt Финиш 国内 - 镜像";
echo $transliterator->transliterate($str), "\n";
ASAaeiou Chen Hai yao Munchen Faisst Finis guo nei - jing xiang

当仅对与您指定要保留的字符范围(意大利重音字符 [àèìòù])不匹配的句段应用音译时,它应该提供结果。

一种选择是使用 preg_replace_callback为此。

它需要有一个回调来应用音译:

$transliterate = static function (array $match) use ($transliterator) {
return $transliterator->transliterate($match[0]);
};

而且它需要有一个模式来匹配除要保留的字符之外的所有内容。它需要正确定义并与 Unicode 兼容:

([^\xE0\xE8\xEC\xF2\xF9]+)ui


(...) : delimiters: the regular expression is inside
u : modifier: u - Unicode mode (UTF-8 encoding in
PHP, PCRE_UTF8)
i : modifier: i - letters in the pattern match
both upper and lower case letters
(PCRE_CASELESS)

[^...] : character class: not matching any of the
characters (`^`); negated character class
\xE0\xE8\xEC\xF2\xF9 : the italian accented characters àèìòù written
in a stable notation (you can easily copy and
paste it for example)

最后但同样重要的是,要操作的主题必须与要保留的字符兼容。由于在 Unicode 中可以有多种方式来书写相同的字符,因此输入被规范化兼容 PCRE 模式:

echo preg_replace_callback(
'([^\xE0\xE8\xEC\xF2\xF9]+)ui',
$transliterate,
Normalizer::normalize($str, Normalizer::NFC)
), "\n";

输出:

ASAàèìòù Chen Hai yao Munchen Faisst Finis guo nei - jing xiang

Example across PHP versions .


附录:

  • \xE0\xE1\xE8\xE9\xEC\xED\xF2\xF3\xF9\xFA 意大利重音字符的小写列表(可与 i-modifier 一起使用)
  • \xC0\xC1\xC8\xC9\xCC\xCD\xD2\xD3\xD9\xDA\xE0\xE1\xE8\xE9\xEC\xED\xF2\xF3\xF9\xFA意大利语重音字符的小写和大写列表(可以在没有 i 修饰符的情况下使用)
  • PCRE 语法字符(摘录):
       \xhh       character with hex code hh
    \x{hhh..} character with hex code hhh..
  • 完整 PCRE 语法链接:https://www.pcre.org/original/doc/html/pcresyntax.html

关于php - 从音译器转换中排除特定字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67571235/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com