声明包含希伯来字符的翻译数组后,str_replace() 不会按预期替换子字符串

问题描述 投票:0回答:2

我有一个包含希伯来语单词的数组,我需要在字符串中找到并替换它。翻译数组被定义为键值对。

在英语中,这有效。

   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 (
    'עיצוב-פנים'            =>  'עיצוב פנים',
    'עיצוב-פנים'            =>  'מעצבת פנים',
    'עיצוב-פנים'            =>  'עיצוב משרדים',
);

但是……这似乎在希伯来语中根本不起作用。 谁能解释一下出了什么问题吗?

php arrays replace right-to-left hebrew
2个回答
0
投票

您需要使用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 (默认情况下)不理解这些。


0
投票

让您困惑的不是本机 PHP 函数的行为,而是您定义包含从右到左字符的查找数组的方式。

您的数组声明为:

$replacements = array (
    'עיצוב-פנים'  =>  'עיצוב פנים',
    'עיצוב-פנים'  =>  'מעצבת פנים',
    'עיצוב-פנים'  =>  'עיצוב משרדים',
);

请注意,对于 RTL 字符串,

=>
的方向也会受到影响。如果你用
var_export()
打印出来,你会得到:

array (
  'עיצוב-פנים' => 'עיצוב משרדים',
)

您会看到每行右侧的三个相同的值“实际上”是键,PHP 不允许您在数组的单个级别上有重复的键。因此,您的数据不仅会崩溃,而且无法按替换任务的预期工作。

要更正数据,请颠倒预期键和值的位置。
[value <= key, ...]

$replacements = array(
    'עיצוב פנים' => 'עיצוב-פנים',
    'מעצבת פנים' => 'עיצוב-פנים',
    'עיצוב משרדים' => 'עיצוב-פנים',
);

然后 
echo strtr($input, $replacements);

将完全按照预期工作。

str_replace()

也可以工作,但您需要将键隔离为值数组,并分别传递查找和替换参数。因为所有替换都是相同的,所以如果您要使用

str_replace()
,您可以将单个字符串值写入作为第二个参数。
这是上面讨论的所有内容的演示。 

https://3v4l.org/pms5Z

© www.soinside.com 2019 - 2024. All rights reserved.