You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP如何按顺序高亮两个字符串的差异单词并修复现有代码报错

PHP 字符串差异单词高亮解决方案

问题根源

原有代码的问题在于默认两个字符串的差异只有新增场景:只要当前位置单词不等,就判定是$string2多了一个单词,执行$i--回退遍历进度。如果遇到单词修改的场景,两个数组对应位置的单词永远匹配不上,就会进入$index不断递增、$i原地踏步的死循环,最终$i+$index超出$array2的长度触发下标错误。

修复后可用代码

<?php
function highlight_diff(string $string1, string $string2): string
{
    $arr1 = explode(' ', $string1);
    $arr2 = explode(' ', $string2);
    $p1 = 0; // 字符串1的遍历指针
    $p2 = 0; // 字符串2的遍历指针
    $len1 = count($arr1);
    $len2 = count($arr2);
    $output = [];

    while ($p1 < $len1 && $p2 < $len2) {
        if ($arr1[$p1] === $arr2[$p2]) {
            // 单词一致,直接输出
            $output[] = $arr2[$p2];
            $p1++;
            $p2++;
            continue;
        }
        // 单词不一致,先判断是不是string2新增了单词:检查arr2当前值之后是否存在arr1当前指针位置的单词
        $nextMatch = array_search($arr1[$p1], array_slice($arr2, $p2 + 1));
        if ($nextMatch !== false) {
            // 是新增单词,高亮
            $output[] = "<b>{$arr2[$p2]}</b>";
            $p2++;
        } else {
            // 是原有单词修改,高亮新值
            $output[] = "<b>{$arr2[$p2]}</b>";
            $p1++;
            $p2++;
        }
    }

    // 处理string2剩余的所有新增单词
    while ($p2 < $len2) {
        $output[] = "<b>{$arr2[$p2]}</b>";
        $p2++;
    }

    return implode(' ', $output);
}

// 测试用例
$string1 = "TO THE ORDER OF United Bank Limited Arab -09254 DT:17-06-20212 ADS";
$string2 = "Arab TO THE ORDER OF United Bank Limited Arab TO -092541 KDS DT:17-06-20212";

echo '原字符串1:' . $string1 . '<br>';
echo '差异高亮后的字符串2:' . highlight_diff($string1, $string2);
?>

效果说明

运行上述代码后,Arab、TO、-092541、KDS四个单词都会被加粗高亮,完全符合需求,同时不会出现死循环和下标错误,兼容新增、修改两种差异场景。

内容的提问来源于stack exchange,提问作者Mahmood Sanjrani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:06:03