我有一个案例,我将返回数据库结果,并根据搜索字词在页面上显示它们。这部分工作正常,但我希望通过将它们包含在span标签中来高亮显示这些搜索项。我开始编写一个函数,我调用了每个使用str_replace函数的结果,但随后我突然意识到这也会影响HTML标记中的任何文本。有没有人有他们用来有效地做这个的功能?我正在使用PHP 4。 谢谢!
答案 0 :(得分:3)
我会用javascript来突出显示
$(document).ready(function(){
$('#your_results_list').removeHighlight().highlight('search_word');
}
这样你就不会弄乱源,用户可以根据需要调整高亮等等。
答案 1 :(得分:2)
我曾经在Perl中编写了一个搜索,就像这样(对PHP做了一点翻译):
// Split up the full page content in pieces without `<` and `>`
preg_match_all("/([^<>]+)/", $pageContent, $matches);
foreach ($matches as $val) {
// Just print the $val if it was between < and >
if (preg_match("/<$val>/", $pageContent) { print "<$val>"; }
else {
// Do the replace
print str_replace( "$searchString", "<span>$searchString</span>", $val);
}
}
如果符合以下条件,您可以避免使用正则表达式:
// Split up the full page content in pieces with `<`
$matches = split("<", $pageContent);
foreach ($matches as $val) {
// Just print the $val if it was between < and >
if (stristr($pageContent, "<$val")) { print "<$val"; }
else {
// Do the replace
print str_replace( "$searchString", "<span>$searchString</span>", $val);
}
}
没有测试,但应该是这样的。
答案 2 :(得分:0)
如果您要返回显示它们的结果和,那么您是否应该在将原始数据转换为html之前访问原始数据?如果是这样,那么通过在那里添加span标记来修改原始数据。
如果您说您的原始数据已经其中包含html,您可以使用正则表达式来检测您是否在html标记内,并使用preg_replace而不是str_replace。
其他选择:
- 将结果加载到dom解析器中,并且只对叶文本节点上的替换操作
- 编写自己的解析器以跟踪您是否在html标记内
- 从结果中抽出所有HTML标记,放入占位符之类 “[[[tag1]]] balha blah blah [[[tag2]]]”然后对剩余的文本进行替换,然后将代码替换回来