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
相关产品推荐
相关产品推荐

