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></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
)
解决您评论中提到的问题的部分是负面前瞻:(?![^\&]*\;)
这基本上意味着不在 &
和 ;
之间的任何内容。
现在,在 &
和 ;
都是 的某些边缘情况下,这显然会 运行 成为问题 实际文本的一部分。如果您没有进行任何类型的文本和查询 limitation/sanitation,我不确定是否有任何方法适用于 所有 可能的情况。
我正在尝试编写一个搜索功能,在结果中突出显示搜索查询。目前我正在使用此代码 $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-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
)
解决您评论中提到的问题的部分是负面前瞻:(?![^\&]*\;)
这基本上意味着不在 &
和 ;
之间的任何内容。
现在,在 &
和 ;
都是 的某些边缘情况下,这显然会 运行 成为问题 实际文本的一部分。如果您没有进行任何类型的文本和查询 limitation/sanitation,我不确定是否有任何方法适用于 所有 可能的情况。