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);
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() ...
}
Так что, если вы передадите то, что не хотите разрешать, он вернет вам список элементов 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/>
и некоторые из, хм, странных вариаций. И, конечно же, есть больше тегов.
Так что это, вероятно, не готово к производству. Но ты получил идею.
Во-первых, посмотрите, что другие сказали по этой теме: