我有一个案例,我正在返回数据库结果并根据搜索词在页面上显示它们。这部分工作正常,但我想通过将它们包装在 span 标签中来突出显示这些搜索词。我开始编写一个函数,我在使用 str_replace 函数的每个结果上调用它,但后来我意识到这也会影响 HTML 标记中的任何文本。有没有人有他们用来有效地做到这一点的功能?我正在使用 PHP 4。谢谢!
问问题
512 次
3 回答
3
我会用javascript突出显示
$(document).ready(function(){
$('#your_results_list').removeHighlight().highlight('search_word');
}
这样你就不会弄乱源,用户可以根据需要转高亮,等等。
于 2009-04-11T03:55:07.187 回答
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);
}
}
没有测试,但应该是这样的。
于 2009-04-10T19:06:46.273 回答
0
如果您要返回结果并显示它们,那么您不应该在原始数据在 html 中生成之前访问它吗?如果是这样,那么通过在其中添加跨度标签来修改原始数据。
如果您说您的原始数据中可能已经包含 html,您可以使用正则表达式来检测您是否在 html 标记内,并使用 preg_replace 而不是 str_replace。
其他选项:
--将结果加载到dom解析器中,并且只对叶子文本节点进行替换操作
-- 编写你自己的解析器来跟踪你是否在一个 html 标签内
-- 从结果中抽出所有 HTML 标签,放入占位符,如“[[[tag1]]] balha blah blah [[[tag2]]]”,然后替换剩余的文本,然后将标签替换回
于 2009-04-10T19:07:31.200 回答