2010-12-14 124 views
5

所以我正在为注释做一个搜索功能。其他人在这里帮助我SQL query。 我还想要做的是在结果中突出显示搜索查询文本。PHP - 突出显示来自包含HTML的字符串的文本

结果以HTML形式存储在$variable中。 例如,如何将搜索查询文本包装在<span>标记中,而不会弄乱html。

例如。搜索查询可以foo bar和输出可以看起来像:

<p>bla bla foo bar bla</p> 

所以它应该是这样的:

<p>bla <span class="highlight">foo bar</span> bla bla</p> 

回答

2

我觉得这是比它更复杂的外观。如果我们正在寻找foo bar然后

<p>bla bla foo bar bla</p> 

将被转换成

<p>bla <span class="highlight">foo bar</span> bla bla</p> 

但对于一些特殊情况?这可能是foo bar是一个HTML标签中匹配:

<p>bla bla <span class="foo bar">foo bar</span> bla</p> 

将被替换为

<p>bla <span class="<span class="highlight">foo bar</span>">foo bar</span> bla bla</p> 

我说得对这个?我没有遇到过这个问题,但我建议你在Text助手中检查CakePHP的文档(是的,我知道你没有使用该框架),highlight()方法可以正确处理HTML标记。看看源代码,给它一个镜头,如果它适合你,请继续并复制它。

+1

是的,这种情况可能会发生。我应该在问题中提到这一点。无论如何,我发现一个更简单的解决方案,使用jQuery! :d – Alex 2010-12-14 21:24:06

1
$searchString = 'foo bar'; 
$searchResult = '<p>bla bla foo bar bla</p>'; 

var_dump(str_replace($searchString, '<span>'.$searchString.'</span>', $searchResult)); 

var_dump(preg_replace('/'.$searchString.'/', '<span>'.$searchString.'</span>', $searchResult)); 
1

如果您确保搜索词本身不包含任何HTML,你可以直接在"<span>"的帮助下将其包装在str_replace()的帮助下。

请注意,这是通过字符串函数处理HTML的非常罕见的场合之一本身

如果搜索项可以包含HTML(即高亮区可以跨越标签边界),事情就会变得复杂得多,而且您不会像上面那样使用巧妙的快捷方式。

+1

还有另一个问题。例如。输出可以有'',然后标记分解.. – Alex 2010-12-14 20:51:23

+0

@Alex:这是真的,这正是使用基本字符串操作通常被认为是使用HTML的禁止的原因。如果这种简单化的方法可行或不可行,这取决于您的数据。如果评论可以包含*任何* HTML,那么你很快就会处在“更复杂”的角落。 – Tomalak 2010-12-14 22:27:17

7

简单的查找和替换:

$resultHTML = str_replace($searchString, '<span class="highlight">'.$searchString.'</span>', $resultHTML); 
+1

http://php.net/manual/en/function.str-replace.php – 2010-12-14 20:49:57

+4

别忘了还有一个不区分大小写的版本... str_ireplace – jocull 2010-12-14 20:54:36

+0

不错的一个...我发现了 – 2011-12-20 12:29:21

2
<?php 

$result = "<p>Bla bla foo bar bla bla test x x x</p>"; 

$query = "foo bar"; 

// The important point here is, USE single quote (') in replacement part!! 
echo preg_replace("/($query)/", '<span class="highlight">${1}</span>', $result); 
+1

你可以使用double也引用,只是要逃脱他们。欲了解更多信息 - http://en.wikipedia.org/wiki/Escape_character – jolt 2010-12-14 21:27:04

+0

谢谢..这就像魅力meee ... – 2014-09-14 12:15:53

1

我有同样的问题,但我发现this

的代码被编译,随意改变高亮颜色,但是这是通过一个函数来完成,所以很容易修改使用一种颜色:

 $color = '#FCB514'; //self::generate_colors(); 

First Post!

0

text-shadow:1px 1px 1px#FCD600;

相关问题