我有一个有趣的问题,我使用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');
解决此类问题的聪明方法是什么?
答案 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.