strip_tags запрещает некоторые теги

На основе strip_tags В документации второй параметр принимает допустимые теги. Однако в моем случае я хочу сделать обратное. Скажи, что я приму теги script_tags обычно (по умолчанию) принимают, но удаляют только <script> тег. Любой возможный способ для этого?

Я не имею в виду, что кто-то может написать это для меня, а скорее высказывает мнение о возможных путях достижения этого (если возможно).

5 ответов

Решение

РЕДАКТИРОВАТЬ

Чтобы использовать очиститель HTML HTML.ForbiddenElements директива config, кажется, вы бы сделали что-то вроде:

require_once '/path/to/HTMLPurifier.auto.php';

$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.ForbiddenElements', array('script','style','applet'));
$purifier = new HTMLPurifier($config);
$clean_html = $purifier->purify($dirty_html);

http://htmlpurifier.org/docs

HTML.ForbiddenElements должен быть установлен на array, То, что я не знаю, это то, что образуют array Участники должны взять:

array('script','style','applet')

Или же:

array('<script>','<style>','<applet>')

Или что-то другое?

Я думаю, что это первая форма, без разделителей; HTML.AllowedElements использует форму строки конфигурации, несколько распространенную в TinyMCE valid elements синтаксис:

tinyMCE.init({
    ...
    valid_elements : "a[href|target=_blank],strong/b,div[align],br",
    ...
});

Так что я думаю, что это просто термин, и никакие атрибуты не должны предоставляться (так как вы запрещаете элемент... хотя есть HTML.ForbiddenAttributes, тоже). Но это предположение.

Я добавлю эту заметку из HTML.ForbiddenAttributes Документы, а также:

Предупреждение: эта директива дополняет %HTML.ForbiddenElements соответственно, ознакомьтесь с этой директивой для обсуждения того, почему вы должны дважды подумать, прежде чем использовать эту директиву.

Черный список не так надежен, как белый, но у вас могут быть свои причины. Просто будьте осторожны и будьте осторожны.

Без тестирования я не уверен что тебе сказать. Я буду продолжать искать ответ, но я, скорее всего, сначала пойду спать. Это очень поздно. :)


Хотя я думаю, что вы действительно должны использовать очиститель HTML и использовать его HTML.ForbiddenElements Директива конфигурации, я думаю, разумная альтернатива, если вы действительно, действительно хотите использовать strip_tags() это получить белый список из черного списка. Другими словами, удалите то, что вы не хотите, а затем используйте то, что осталось.

Например:

function blacklistElements($blacklisted = '', &$errors = array()) {
    if ((string)$blacklisted == '') {
        $errors[] = 'Empty string.';
        return array();
    }

    $html5 = array(
        "<menu>","<command>","<summary>","<details>","<meter>","<progress>",
        "<output>","<keygen>","<textarea>","<option>","<optgroup>","<datalist>",
        "<select>","<button>","<input>","<label>","<legend>","<fieldset>","<form>",
        "<th>","<td>","<tr>","<tfoot>","<thead>","<tbody>","<col>","<colgroup>",
        "<caption>","<table>","<math>","<svg>","<area>","<map>","<canvas>","<track>",
        "<source>","<audio>","<video>","<param>","<object>","<embed>","<iframe>",
        "<img>","<del>","<ins>","<wbr>","<br>","<span>","<bdo>","<bdi>","<rp>","<rt>",
        "<ruby>","<mark>","<u>","<b>","<i>","<sup>","<sub>","<kbd>","<samp>","<var>",
        "<code>","<time>","<data>","<abbr>","<dfn>","<q>","<cite>","<s>","<small>",
        "<strong>","<em>","<a>","<div>","<figcaption>","<figure>","<dd>","<dt>",
        "<dl>","<li>","<ul>","<ol>","<blockquote>","<pre>","<hr>","<p>","<address>",
        "<footer>","<header>","<hgroup>","<aside>","<article>","<nav>","<section>",
        "<body>","<noscript>","<script>","<style>","<meta>","<link>","<base>",
        "<title>","<head>","<html>"
    );

    $list = trim(strtolower($blacklisted));
    $list = preg_replace('/[^a-z ]/i', '', $list);
    $list = '<' . str_replace(' ', '> <', $list) . '>';
    $list = array_map('trim', explode(' ', $list));

    return array_diff($html5, $list);
}

Затем запустите это:

$blacklisted = '<html> <bogus> <EM> em li ol';
$whitelist = blacklistElements($blacklisted);

if (count($errors)) {
    echo "There were errors.\n";
    print_r($errors);
    echo "\n";
} else {
    // Do strip_tags() ...
}

http://codepad.org/LV8ckRjd

Так что, если вы передадите то, что не хотите разрешать, он вернет вам список элементов HTML5 в виде array форма, которую вы можете кормить в strip_tags() после объединения в строку:

$stripped = strip_tags($html, implode('', $whitelist)));

Пусть покупатель будет бдителен

Теперь я вроде как взломал это вместе, и я знаю, что есть некоторые проблемы, которые я еще не обдумал. Например, из strip_tags() справочная страница для $allowable_tags аргумент:

Замечания:

Этот параметр не должен содержать пробелов. strip_tags() видит тег как регистронезависимую строку между < и первый пробел или >, Это означает, что strip_tags("<br/>", "<br>") возвращает пустую строку.

Уже поздно, и по какой-то причине я не могу понять, что это значит для этого подхода. Так что мне придется подумать об этом завтра. Я также скомпилировал список элементов HTML в функции $html5 элемент из этой страницы документации MDN. Читатель с острыми глазами может заметить, что все теги имеют следующую форму:

<tagName>

Я не уверен, как это повлияет на результат, нужно ли мне принимать во внимание различия в использовании ярлыка <tagName/> и некоторые из, хм, странных вариаций. И, конечно же, есть больше тегов.

Так что это, вероятно, не готово к производству. Но ты получил идею.

Во-первых, посмотрите, что другие сказали по этой теме:

Убрать теги