PHP突出显示查询和转义html特殊字符
我试图编写一个搜索功能,突出搜索结果中的查询。目前,我正在使用此代码$hightlight = preg_replace('/'.strtolower($query).'/', '<span class=hightlight>'.strtolower($query).'</span>', strtolower($text));
进行突出显示,这很好。我正在搜索的文本是来自数据库的字符串。现在的问题是,如果文本包含一些html特殊字符,例如<test>
和用户搜索<te
我得到以下结果:<span class="hightlight"><te< span="">st></te<></span>
这被解释为st>
。这是有道理的,但我不想要这个。我想<test>
作为<te
突出显示的结果。所以我需要逃避特殊字符。我知道有功能htmlspecialchars
,但是在这种情况下我该如何使用它?还是另一个功能?在搜索之前我无法逃避它们,因为我也在HTML代码中搜索。搜索后我也无法逃避它们,因为文本中的<span>
标签并且它们也将被转换为HTML代码。我希望你能理解我的问题。有没有人为此提供解决方案?PHP突出显示查询和转义html特殊字符
结合使用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;
?>
(小纸条,我把改变的自由hightlight
到highlight
)
这可以解决您的评论中提到的问题的部分是负前瞻:(?![^\&]*\;)
这基本上意味着不在&
和;
之间的任何东西。现在
,这可能会明显一些边缘情况下&
和;
是实际文本的两个一部分碰到的问题。如果您没有做任何形式的文字查询限制/卫生设施,我不确定是否有任何适用于所有可能的情况。
感谢您的回答帕特里克,这绝对比我的解决方案更好,解决了我的问题。但是正如你所提到的那样,当'&'和';'都在查询中时都有错误。所以答案仍然不完美。如果有人有更好的解决方案(如果可能的话),请在这里发布。 – DreiDe
刚才通过'htmlspecialchars()'运行'$ query'和'$ text'有什么问题? –
@PatrickQ如果我举个例子来搜索't',我得到了一个错误的结果,因为'>'是HTML代码,这个'>'和't'代码只是't'的HTML代码。所以'''HTML代码中的t也会被高亮显示,并且HTML代码将以纯文本显示。 – DreiDe