我正在尝试将包含希伯来语的字符串从 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()
模式隔离连续的空格分隔的希伯来语单词,然后匿名函数将多字节字母拆分为单独的数组元素,然后反转它们的顺序并将元素连接回单个突变字符串。