插件窝 干货文章 PHP字符串与数组对比:如何高效高亮显示长字符串中重复的子字符串?

PHP字符串与数组对比:如何高效高亮显示长字符串中重复的子字符串?

字符串 重复 高亮 substr 123    来源:    2025-03-13

在PHP中,如果你想要高效地高亮显示长字符串中重复的子字符串,可以通过以下步骤实现:

  1. 提取重复的子字符串:首先,你需要找出字符串中所有重复出现的子字符串。
  2. 高亮显示:然后,将这些重复的子字符串用特定的标记(如HTML标签)包裹起来,以实现高亮效果。

实现步骤

1. 提取重复的子字符串

你可以使用正则表达式来查找重复的子字符串。以下是一个示例代码,用于查找字符串中所有重复的子字符串:

function findRepeatedSubstrings($str, $minLength = 2) {
    $n = strlen($str);
    $repeated = [];

    for ($i = 0; $i < $n; $i++) {
        for ($j = $i + 1; $j < $n; $j++) {
            $substr = substr($str, $i, $j - $i + 1);
            if (strlen($substr) >= $minLength && strpos($str, $substr, $j + 1) !== false) {
                $repeated[$substr] = true;
            }
        }
    }

    return array_keys($repeated);
}

$str = "这是一个测试字符串,测试字符串中有重复的子字符串。";
$repeatedSubstrings = findRepeatedSubstrings($str);
print_r($repeatedSubstrings);

2. 高亮显示重复的子字符串

找到重复的子字符串后,你可以使用str_replace函数将这些子字符串用HTML标签包裹起来,以实现高亮效果:

function highlightRepeatedSubstrings($str, $repeatedSubstrings) {
    foreach ($repeatedSubstrings as $substr) {
        $highlighted = "<span style='background-color: yellow;'>$substr</span>";
        $str = str_replace($substr, $highlighted, $str);
    }
    return $str;
}

$highlightedStr = highlightRepeatedSubstrings($str, $repeatedSubstrings);
echo $highlightedStr;

完整代码示例

function findRepeatedSubstrings($str, $minLength = 2) {
    $n = strlen($str);
    $repeated = [];

    for ($i = 0; $i < $n; $i++) {
        for ($j = $i + 1; $j < $n; $j++) {
            $substr = substr($str, $i, $j - $i + 1);
            if (strlen($substr) >= $minLength && strpos($str, $substr, $j + 1) !== false) {
                $repeated[$substr] = true;
            }
        }
    }

    return array_keys($repeated);
}

function highlightRepeatedSubstrings($str, $repeatedSubstrings) {
    foreach ($repeatedSubstrings as $substr) {
        $highlighted = "<span style='background-color: yellow;'>$substr</span>";
        $str = str_replace($substr, $highlighted, $str);
    }
    return $str;
}

$str = "这是一个测试字符串,测试字符串中有重复的子字符串。";
$repeatedSubstrings = findRepeatedSubstrings($str);
$highlightedStr = highlightRepeatedSubstrings($str, $repeatedSubstrings);

echo $highlightedStr;

优化建议

  • 性能优化:如果字符串非常长,上述方法可能会比较慢。可以考虑使用更高效的算法或数据结构(如后缀树)来查找重复的子字符串。
  • 最小长度:可以通过调整$minLength参数来控制最小匹配长度,避免匹配过短的子字符串。

输出示例

假设输入字符串为"这是一个测试字符串,测试字符串中有重复的子字符串。",输出可能如下:

这是一个<span style='background-color: yellow;'>测试字符串</span>,<span style='background-color: yellow;'>测试字符串</span>中有重复的子字符串。

这样,重复的子字符串就会被高亮显示。