使用str_ireplace()突出显示文本

时间:2012-03-21 18:32:42

标签: php replace

我有一个有趣的问题,我使用PHP的str_ireplace()突出显示关键字数组中的文本。

让我们说这是我想要从示例文本中突出显示的关键字或短语数组:

$keywords = array('eggs', 'green eggs');

这是我的示例文本:

$text = 'Green eggs and ham.';

以下是我如何突出显示文字:

$counter = 0;
foreach ($keywords as $keyword) {
    $text = str_ireplace($keyword, '<span class="highlight_'.($counter%5).'">'.$keyword.'</span>', $text);
    $counter++;
}

问题是green eggs永远不会匹配,因为eggs已在文本中替换为:

Green <span class="highlight_0">eggs</span> and ham.

也可能存在部分重叠的情况,例如:

$keywords = array('green eggs', 'eggs and'); 

解决此类问题的聪明方法是什么?

2 个答案:

答案 0 :(得分:1)

撤销订单:

$keywords = array('green eggs', 'eggs');

最简单的方法是首先执行最长的字符串,然后再转到较短的字符串。只要确保你没有翻过同一个字符串(如果重要的话)。

答案 1 :(得分:1)

也许这不是最漂亮的解决方案,但您可以跟踪关键字出现的位置,然后找到它们重叠的位置并调整您想要包含范围标记的位置

$keywords = array('eggs', 'n eggs a', 'eggs and','green eg');
$text = 'Green eggs and ham.';
$counter = 0;
$idx_array = array();
$idx_array_last = array();
foreach ($keywords as $keyword) {
    $idx_array_first[$counter] = stripos($text, $keyword);
    $idx_array_last[$counter] = $idx_array_first[$counter] + strlen($keyword);
    $counter++;
}
//combine the overlapping indices
for ($i=0; $i<$counter; $i++) {
    for ($j=$counter-1; $j>=$i+1; $j--) {
        if (($idx_array_first[$i] <= $idx_array_first[$j] && $idx_array_first[$j] <= $idx_array_last[$i]) 
                || ($idx_array_last[$i] >= $idx_array_last[$j] && $idx_array_first[$i] <= $idx_array_last[$j])
                || ($idx_array_first[$j] <= $idx_array_first[$i] && $idx_array_last[$i] <= $idx_array_last[$j])) {
            $idx_array_first[$i] = min($idx_array_first[$i],$idx_array_first[$j]);
            $idx_array_last[$i] = max($idx_array_last[$i],$idx_array_last[$j]);
            $counter--;
            unset($idx_array_first[$j],$idx_array_last[$j]);
        }
    }
}
array_multisort($idx_array_first,$idx_array_last); //sort so that span tags are inserted at last indices first

for ($i=$counter-1; $i>=0; $i--) {
    //add span tags at locations of indices
    $textnew = substr($text,0,$idx_array_first[$i]).'<span class="highlight_'.$i.'">';
    $textnew .=substr($text,$idx_array_first[$i],$idx_array_first[$i]+$idx_array_last[$i]);
    $textnew .='</span>'.substr($text,$idx_array_last[$i]);
    $text = $textnew;
}

输出

<span class="highlight_0">Green eggs and</span> ham.