PHP 高亮查询并转义 html 个特殊字符

PHP highlight query and escape html special characters

我正在尝试编写一个搜索功能,在结果中突出显示搜索查询。目前我正在使用此代码 $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-Codes 中搜索。我也无法在搜索后转义它们,因为文本中的 <span> 标签也将被转换为 HTML-Codes。我希望你能理解我的问题。有人对此有解决方案吗?

结合使用 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)

DEMO

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

这基本上意味着不在 &; 之间的任何内容。

现在,在 & ; 都是 的某些边缘情况下,这显然会 运行 成为问题 实际文本的一部分。如果您没有进行任何类型的文本和查询 limitation/sanitation,我不确定是否有任何方法适用于 所有 可能的情况。