PHP等长字符串差异高亮程序:单单词正常,句子对比时HTML代码异常输出问题
我来帮你排查这个问题,核心原因是你用了str_replace()做全局替换,这在处理有重复字符的句子时会彻底打乱你的高亮逻辑。
问题根源解析
当你在循环里发现第i位字符不同时,你提取了$var2[$i]这个字符,然后用str_replace()把$temp里所有和它匹配的字符都换成带红色背景的<span>标签。比如假设你对比的是"I love PHP"和"I love Java",当循环到第7位的J和P时,你会把temp里所有的J(这里只有一个)替换,但如果第二个字符串是"Java is fun",第一个是"PHP is fun",当处理到第0位的J和P时,str_replace()会把temp里所有的J都替换——如果句子里还有其他J,就会被错误高亮。这就是为什么处理句子时HTML输出异常的原因,因为你错误地高亮了很多不该高亮的字符,导致页面上的HTML结构混乱。
解决方案
正确的做法是只替换当前索引位置的字符,而不是全局替换。我们可以把字符串转换成数组,直接修改对应索引的元素,最后再拼接成字符串。另外,为了避免HTML特殊字符(比如<、>)导致的解析问题,我们还要用htmlspecialchars()对每个字符进行转义。
修改后的完整代码:
<form action="#" method="post"> <input type="text" name="first" placeholder="输入第一个字符串"><br> <input type="text" name="second" placeholder="输入第二个字符串"><br> <input type="submit" value="对比差异"> </form> <?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $var1 = trim($_POST['first'] ?? ''); $var2 = trim($_POST['second'] ?? ''); // 先检查两个字符串长度是否相等 if (strlen($var1) !== strlen($var2)) { echo "<p>错误:两个字符串长度必须相等!</p>"; exit; } echo "<p>原字符串:" . htmlspecialchars($var1) . "</p>"; echo "<p>对比字符串:</p>"; // 将字符串转为数组,方便逐个修改 $temp = str_split($var2); for ($i = 0; $i < strlen($var1); $i++) { if ($var1[$i] !== $var2[$i]) { // 对差异字符转义后包裹高亮标签 $diff_char = htmlspecialchars($var2[$i]); $temp[$i] = '<span style="background:red;color:white;">' . $diff_char . '</span>'; } else { // 相同字符也要转义,避免HTML解析问题 $temp[$i] = htmlspecialchars($var2[$i]); } } // 拼接数组为字符串并输出 echo implode('', $temp); } ?>
关键修改点说明
- 增加了请求方法判断,避免页面首次加载时直接执行PHP逻辑
- 增加了字符串长度校验,防止循环时出现数组越界错误
- 用
str_split()把字符串转为数组,直接修改对应索引的元素,确保只替换当前位置的差异字符 - 所有输出的字符都用
htmlspecialchars()转义,避免HTML特殊字符导致的页面解析异常 - 优化了表单的占位符和提交按钮文本,提升用户体验
内容的提问来源于stack exchange,提问作者Sagar
相关产品推荐
相关产品推荐

