我有一个包含希伯来语单词的数组,我需要在字符串中找到并替换它。翻译数组被定义为键值对。
在英语中,这有效。
function replace_twophrase_words($string) {
$string = strtolower($string);
$replacements = array (
'movers' => 'Moving Services',
'home-moving' => 'Home Moving',
'commercial-moving' => 'office-moving',
);
$string = str_replace($replacements, array_keys($replacements), $string);
}
希伯来语数组(在评论中询问):
$replacements = array (
'עיצוב-פנים' => 'עיצוב פנים',
'עיצוב-פנים' => 'מעצבת פנים',
'עיצוב-פנים' => 'עיצוב משרדים',
);
但是……这似乎在希伯来语中根本不起作用。 谁能解释一下出了什么问题吗?
您需要使用mb_ereg_replace:
setlocale( LC_CTYPE, 'en_US.UTF-8' );
header( 'Content-Type: text/plain; charset=utf-8' );
echo mb_ereg_replace( 'עיצוב-פנים', 'עיצוב פנים', 'Hebrew string is here: עיצוב-פנים ; and back to Latin.' );
这是因为希伯来字母是由多个字节组成的,str_reaplce 和 preg_replace (默认情况下)不理解这些。
让您困惑的不是本机 PHP 函数的行为,而是您定义包含从右到左字符的查找数组的方式。
您的数组声明为:
$replacements = array (
'עיצוב-פנים' => 'עיצוב פנים',
'עיצוב-פנים' => 'מעצבת פנים',
'עיצוב-פנים' => 'עיצוב משרדים',
);
请注意,对于 RTL 字符串,
=>
的方向也会受到影响。如果你用 var_export()
打印出来,你会得到:
array (
'עיצוב-פנים' => 'עיצוב משרדים',
)
您会看到每行右侧的三个相同的值“实际上”是键,PHP 不允许您在数组的单个级别上有重复的键。因此,您的数据不仅会崩溃,而且无法按替换任务的预期工作。
要更正数据,请颠倒预期键和值的位置。[value <= key, ...]
$replacements = array(
'עיצוב פנים' => 'עיצוב-פנים',
'מעצבת פנים' => 'עיצוב-פנים',
'עיצוב משרדים' => 'עיצוב-פנים',
);
然后
echo strtr($input, $replacements);
将完全按照预期工作。
str_replace()
也可以工作,但您需要将键隔离为值数组,并分别传递查找和替换参数。因为所有替换都是相同的,所以如果您要使用
str_replace()
,您可以将单个字符串值写入作为第二个参数。这是上面讨论的所有内容的演示。 https://3v4l.org/pms5Z