在 PHP 中通过字符代码查找 UTF-8 字符串的差异


Find differences in a UTF-8 string by character code in PHP

我需要找到希伯来语(从右到左阅读)句子之间的差异,例如

בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ׃(带有倾斜标记)和

בְּרֵאשִׁית בָּרָא אֱלֹהִים אֵת הַשָּׁמַיִם וְאֵת הָאָרֶץ׃(无斜纹)。

对你来说,它可能看起来没有太大的不同,但希伯来语读者将能够在第一个短语中看到鞘歌标记。

也可能是两个

文本中额外的小点(元音)并不总是相同的情况。

所以我需要一种方法来检查 PHP 中的 UTF-8 编码文本并以某种方式突出显示差异,以便我可以在"Shin"下方的第一个单词上对某人说您缺少 05AD unicode 字符"Dehi"。

$str1 = 'בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ׃';
$str2 = 'בְּרֵאשִׁית בָּרָא אֱלֹהִים אֵת הַשָּׁמַיִם וְאֵת הָאָרֶץ';
$len1 = mb_strlen($str1, 'utf-8');
for($i = 0, $arr1 = array(); $i < $len1; $i++) {
    $char = mb_substr($str1, $i, 1, 'utf-8');
    if (preg_match('/['x{0591}-'x{05c7}]/u', $char)) {
        end($arr1);
        $key = key($arr1);
        $arr1[$key] = $arr1[$key] . $char;
    } else if (preg_match('/'p{Zs}/u', $char)) {
        continue;
    } else {
        $arr1[$i] = $char;
    }
}
ksort($arr1);
$arr1 = array_values($arr1);
$len2 = mb_strlen($str2, 'utf-8');
for($i = 0, $arr2 = array(); $i < $len2; $i++) {
    $char = mb_substr($str2, $i, 1, 'utf-8');
    if (preg_match('/['x{0591}-'x{05c7}]/u', $char)) {
        end($arr2);
        $key = key($arr2);
        $arr2[$key] = $arr2[$key] . $char;
    } else if (preg_match('/'p{Zs}/u', $char)) {
        continue;
    } else {
        $arr2[$i] = $char;
    }
}
ksort($arr2);
$arr2 = array_values($arr2);
$results = array();
foreach ($arr1 as $key => $value) {
    if ($value != $arr2[$key]) {
        $results[$key] = $value;
    }
}

我明白了,结果显示

array (size=8)
  3 => string 'שִׁ֖' (length=8)
  7 => string 'רָ֣' (length=6)
  11 => string 'הִ֑' (length=6)
  14 => string 'אֵ֥' (length=6)
  18 => string 'מַ֖' (length=6)
  22 => string 'אֵ֥' (length=6)
  25 => string 'אָֽ' (length=6)
  27 => string 'ץ׃' (length=4)

第 3、7、11、14、18、22、25、27 个字符不同(从右到左计数,从 0 开始);