0

我有一个案例,我正在返回数据库结果并根据搜索词在页面上显示它们。这部分工作正常,但我想通过将它们包装在 span 标签中来突出显示这些搜索词。我开始编写一个函数,我在使用 str_replace 函数的每个结果上调用它,但后来我意识到这也会影响 HTML 标记中的任何文本。有没有人有他们用来有效地做到这一点的功能?我正在使用 PHP 4。谢谢!

4

3 回答 3

3

我会用javascript突出显示

http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html

$(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 回答