仅反转字符串中连续希伯来语单词的方向,包括非希伯来字符


Only reverse the direction of consecutive Hebrew words in a string including non-Hebrew characters

我正在尝试将包含希伯来语的字符串从 RTL 反转为 LTR,但我的编码尝试也在反转括号。 strrev()不起作用,因为它实际上不适用于 UTF8 字符串。所以我写了一个自定义函数,下面是我的代码:

$str = 'תירס גדול A-10 (פרי גליל)';
function utf8_strrev($str)
{
    $arr = '';
    $words = explode(" ", $str);
    $start_tag = '(';
    $end_tag = ')';
    foreach ($words as $word)
    {
        if (preg_match("/'p{Hebrew}/u", $word))
        {
                preg_match_all('/./us', $word, $ar);
                echo print_r($ar[0]);
                echo '<br>';
                
                $arr = join('', array_reverse($ar[0])) . " " . $arr;
        } else
        {
            preg_match_all('/./us', $word, $ar);
            $arr = join('', $ar[0]) . " " . $arr;
        }
    }
    return $arr;
}

输出:

)לילג ירפ( A-10 לודג סרית 

它应该是什么:

(לילג ירפ) A-10 לודג סרית

在KoenHoeijmakers发布的文档评论中找到了这个函数。我测试了它,但我不读希伯来语,所以我很难判断它是否正常工作。

function utf8_strrev($str){
    preg_match_all('/./us', $str, $ar);
    return join('',array_reverse($ar[0]));
}

编辑

根据再次阅读您的问题,我认为这符合您的需要?

function utf8_strrev($str)
{
    $arr = '';
    $words = explode(" ", $str);
    $start_tag = '(';
    $end_tag = ')';
    foreach ($words as $word)
    {
        if (preg_match("/'p{Hebrew}/u", $word))
        {
                preg_match_all('/./us', $word, $ar);
                $arr = join('', array_reverse($ar[0])) . " " . $arr;
        } else
        {
            preg_match_all('/./us', $word, $ar);
            $arr = join('', $ar[0]) . " " . $arr;
        }
    }
    return preg_replace(array('/')(.)/','/(.)'(/','/'}(.)/','/(.)'{/'),array('($1','$1)','{$1','$1}'),$arr);
}
$str='תירס גדול A-10 {פרי גליל}';
echo utf8_strrev($str);

奥图特

{לילג ירפ} A-10 לודג סרית

再说一次,我不读希伯来语,但希望它能回答你的问题。

注意 我使用 preg_replace 而不是 str_replace 的原因是字符串替换方法给了我问题文本,如( somthing something () something something )

我不会说/读希伯来语,但这似乎可以按预期工作。

我通常不喜欢在preg_调用中嵌套preg_调用,但在这种情况下,将 unicode 字符拆分为数组然后反转元素可以防止打扰mb_encodings。

代码:(演示)

$str = 'תירס גדול A-10 (פרי גליל)';
echo preg_replace_callback(
         "/'p{Hebrew}+(?: 'p{Hebrew}+)*/u",
         fn($m) => implode(
             array_reverse(
                 preg_split('~~u', $m[0], 0, PREG_SPLIT_NO_EMPTY)
             )
         ),
         $str
     );

输出:

סרית A-10 (לילג ירפ)

preg_replace_callback()模式隔离连续的空格分隔的希伯来语单词,然后匿名函数将多字节字母拆分为单独的数组元素,然后反转它们的顺序并将元素连接回单个突变字符串。