Как использовать htmlspecialchars(), но сохранить тег ‹a› вместе с другими в PHP?

Я пытаюсь использовать htmlspecialchars(), но хочу сохранить следующие теги:

<a>, <b> и <i>.

Как мне это сделать?

Решения, которые я нашел, похоже, не работают вместе с тегом атрибута и обычным простым тегом.

Вот фрагмент кода, который я нашел, который должен разрешать теги с атрибутами:

function fix_attributes($match){
    return "<".$match[1].str_replace('&quot;','"',$match[2]).">";
}
function allow_only($str, $allowed){
    $str = htmlspecialchars($str);
    foreach( $allowed as $a ){
        $str = preg_replace_callback("/&lt;(".$a."){1}([\s\/\.\w=&;:#]*?)&gt;/", fix_attributes, $str);
        $str = str_replace("&lt;/".$a."&gt;", "</".$a.">", $str);
    }
    return $str;
}
echo allow_only('This is <b>bold</b> and <a href="http://www.#links">this</a> is <i>italic</i>.', array("b","a","i"));

Источник

Однако он продолжает выдавать ошибку: Использование неопределенных констант fix_attributes

Буду признателен за любую помощь в этом!


person Osman    schedule 14.01.2018    source источник
comment
вместо этого используйте strip_tags(), если хотите сохранить определенные теги.   -  person Funk Forty Niner    schedule 14.01.2018
comment
@FunkFortyNiner, хотя это хорошее общее решение, стоит отметить, что strip_tags() действительно имеет множество проблем и часто может давать плохие результаты (искаженный код). Некоторая форма (очень сложного) регулярного выражения, вероятно, сработает, но это большой ответ......   -  person Martin    schedule 14.01.2018
comment
Если вы хотите использовать именованный обратный вызов в preg_replace_callback, вы должны передать имя функции в виде строки; то есть 'fix_attributes'. Это должно исправить ваше сообщение об ошибке. Но я не могу сказать вам, является ли регулярное выражение безопасным/хорошим.   -  person jh1711    schedule 14.01.2018
comment
@ jh1711 Спасибо! Однако, похоже, он не допускает <? в качестве входных данных и приводит к запрещенной «ошибке».   -  person Osman    schedule 14.01.2018


Ответы (1)


Проблема: использовать функцию обратного вызова без кавычек

для получения дополнительной информации см. http://php.net/manual/en/function.preg-replace-callback.php

 <?php
    function fix_attributes($match){
        return "<".$match[1].str_replace('&quot;','"',$match[2]).">";
    }
    function allow_only($str, $allowed){
        $str = htmlspecialchars($str);
        foreach( $allowed as $a ){
            $str = preg_replace_callback("/&lt;(".$a."){1}([\s\/\.\w=&;:#]*?)&gt;/", "fix_attributes", $str);//use quotes here 
            $str = str_replace("&lt;/".$a."&gt;", "</".$a.">", $str);
        }
        return $str;
    }
    echo allow_only('This is <b>bold</b> and <a href="http://www.#links">this</a> is <i>italic</i>.', array("b","a","i"));
    ?>
person ASHISH SHARMA    schedule 14.01.2018
comment
Спасибо за ответ! Это работает, но, похоже, не позволяет <?, как htmlspecialchars(), обычно принимает и дезинфицирует. Наличие этого в качестве входных данных приводит к ошибке Forbidden. - person Osman; 14.01.2018
comment
Удалось исправить это, мне пришлось отключить Mod_Security - person Osman; 14.01.2018