2017-10-13 180 views
-1

我试图编写一个搜索功能,突出搜索结果中的查询。目前,我正在使用此代码$hightlight = preg_replace('/'.strtolower($query).'/', '<span class=hightlight>'.strtolower($query).'</span>', strtolower($text));进行突出显示,这很好。我正在搜索的文本是来自数据库的字符串。现在的问题是,如果文本包含一些html特殊字符,例如<test>和用户搜索<te我得到以下结果:<span class="hightlight"><te< span="">st&gt;</te<></span>这被解释为st>。这是有道理的,但我不想要这个。我想<test>作为<te突出显示的结果。所以我需要逃避特殊字符。我知道有功能htmlspecialchars,但是在这种情况下我该如何使用它?还是另一个功能?在搜索之前我无法逃避它们,因为我也在HTML代码中搜索。搜索后我也无法逃避它们,因为文本中的<span>标签并且它们也将被转换为HTML代码。我希望你能理解我的问题。有没有人为此提供解决方案?PHP突出显示查询和转义html特殊字符

+0

刚才通过'htmlspecialchars()'运行'$ query'和'$ text'有什么问题? –

+0

@PatrickQ如果我举个例子来搜索't',我得到了一个错误的结果,因为'>'是HTML代码,这个'>'和't'代码只是't'的HTML代码。所以'''HTML代码中的t也会被高亮显示,并且HTML代码将以纯文本显示。 – DreiDe

回答

0

结合使用htmlspecialchars()和正则表达式的负向预测,我认为我们能够解决这个问题。

<php 
$text = "this is just my really basic <test> of words"; 
$query = "<te"; 

$text = htmlspecialchars($text); 
$query = htmlspecialchars($query); 

$highlight = preg_replace('/'.strtolower($query).'(?![^\&]*\;)/', '<span class=highlight>'.strtolower($query).'</span>', strtolower($text)); 

echo $highlight; 
?> 

(小纸条,我把改变的自由hightlighthighlight

DEMO

这可以解决您的评论中提到的问题的部分是负前瞻:(?![^\&]*\;)

这基本上意味着不在&;之间的任何东西。现在

,这可能会明显一些边缘情况下&;实际文本的两个一部分碰到的问题。如果您没有做任何形式的文字查询限制/卫生设施,我不确定是否有任何适用于所有可能的情况。

+0

感谢您的回答帕特里克,这绝对比我的解决方案更好,解决了我的问题。但是正如你所提到的那样,当'&'和';'都在查询中时都有错误。所以答案仍然不完美。如果有人有更好的解决方案(如果可能的话),请在这里发布。 – DreiDe