2015-02-01 2 views
0

Мой веб-сайт предлагает возможность сохранять пользовательские данные и искать их снова. При поиске все данные печатаются, содержащие запрос. Я хочу, чтобы соответствующие подстроки были выделены.Санизировать и выделять текст с помощью HTML одновременно

В упрощенном виде я сделал это так:

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

При печати возвращаемого значения функции, мой 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 

Так что это правильный способ сделать как - санитарии и выделения?

ответ

1

Санируйте как ваши данные, так и запрос. Затем дезинфицированный запрос по-прежнему будет найден в дезинфицированных 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