同时使用 HTML 清理和突出显示文本

Sanitize and Highlight Text with HTML at the same time

我的网站提供了存储用户数据并再次搜索的可能性。搜索时,将打印包含查询的所有数据。我希望突出显示匹配的子字符串。

简而言之,我是这样做的:

function highlight_and_sanitize_search_result($data, $query){
   $highlighted = str_replace(
                       $query,
                       '<span class="highlight">' . $query . '</span>',
                       $data
                  );
   return sanitize($highlighted);
}

当我打印函数的 return 值时,我的 HTML 代码没有经过清理。但是当我清理它时,我的 <span> 也会错误地被清理:

 Query:  match
  Data:  Here is the match
Output:  Here is the &lt;span class=&quot;match&quot;&gt;match&lt;span&gt;

所以我想我可以反过来说:

function sanitize_and_highlight_search_result($data, $query){
   $sanitized = sanitize($highlighted);
   return str_replace(
               $query,
               '<span class="highlight">' . $query . '</span>',
               $data
          );
}

但是,如果您搜索属于经过清理的 HTML 代码的查询,这也会导致错误:

 Query:  &am
  Data:  You & me
Output:  You <span class="highlight">&am</span>p; me

那么什么是正确的兼顾两者的方法 - 清洁和突出显示?

清理您的数据和查询。然后,经过清理的查询仍会在经过清理的 HTML 数据中找到。

function sanitize_and_highlight_search_result($data, $query){
   $sanitized = sanitize($data);
   $query = sanitize($query);
   return str_replace(
               $query,
               '<span class="highlight">' . $query . '</span>',
               $sanitized
          );
}

示例:http://3v4l.org/R9n9U