Фильтрация HTML и php кода
strip_tags(htmlspecialchars(trim($text), ENT_QUOTES));
но возникла такая нужда некоторые HTML теги оставить так как они записаны не превращая их в HTML сущности.
Ну аот например есть такой код:
<b>test</b><br><textarea>blablabla</textarea><i>test</i>
Нужно <b></b><i></i> оставить так как они есть а <textarea></textarea> превратить в HTML сущности.
Я вижу только такой выход...
Если можно с примером
Код:
<?php
$str = "<b>test</b><br><textarea>blablabla</textarea><i>test</i>";
echo strtr($str,array ("<textarea>" => htmlentities("<textarea>"),
"</textarea>" => htmlentities("</textarea>")));
?>
$str = "<b>test</b><br><textarea>blablabla</textarea><i>test</i>";
echo strtr($str,array ("<textarea>" => htmlentities("<textarea>"),
"</textarea>" => htmlentities("</textarea>")));
?>
Если Robinnovich, имел ввиду превращение с исключением
то я "за" с Бяном.
Подобная функция есть в форуме PHPBB там как бы можно вписать в админке в поле "Разрешить HTML теги" – a,b,i,u,img и т.д. все остальные превратятся в HTML сущности
Код:
$text="<b>test</b><br><textarea>blablabla</textarea><i>test</i>";
define("S_TA_SYN","<!--%%START_TEXAREA_SYNONYM%%-->");
define("E_TA_SYN","<!--%%END_TEXAREA_SYNONYM%%-->");
$text=str_replace("<textarea>",S_TA_SYN,$text);
$text=str_replace("</textarea>",E_TA_SYN,$text);
$text=htmlspecialchars($text);
$text=str_replace(S_TA_SYN,"<textarea>",$text);
$text=str_replace(S_TA_SYN,"</textarea>",$text);
define("S_TA_SYN","<!--%%START_TEXAREA_SYNONYM%%-->");
define("E_TA_SYN","<!--%%END_TEXAREA_SYNONYM%%-->");
$text=str_replace("<textarea>",S_TA_SYN,$text);
$text=str_replace("</textarea>",E_TA_SYN,$text);
$text=htmlspecialchars($text);
$text=str_replace(S_TA_SYN,"<textarea>",$text);
$text=str_replace(S_TA_SYN,"</textarea>",$text);
Не наилучший вариант, но все-таки....
Код:
function clean_html($tag)
{
global $board_config;
if (empty($tag[0]))
{
return '';
}
$allowed_html_tags = preg_split('/, */', strtolower($board_config['allow_html_tags']));
$disallowed_attributes = '/^(?:style|on)/i';
// Check if this is an end tag
preg_match('/<[^\w\/]*\/[\W]*(\w+)/', $tag[0], $matches);
if (sizeof($matches))
{
if (in_array(strtolower($matches[1]), $allowed_html_tags))
{
return '</' . $matches[1] . '>';
}
else
{
return htmlspecialchars('</' . $matches[1] . '>');
}
}
// Check if this is an allowed tag
if (in_array(strtolower($tag[1]), $allowed_html_tags))
{
$attributes = '';
if (!empty($tag[2]))
{
preg_match_all('/[\W]*?(\w+)[\W]*?=[\W]*?(["\'])((?:(?!\2).)*)\2/', $tag[2], $test);
for ($i = 0; $i < sizeof($test[0]); $i++)
{
if (preg_match($disallowed_attributes, $test[1][$i]))
{
continue;
}
$attributes .= ' ' . $test[1][$i] . '=' . $test[2][$i] . str_replace(array('[', ']'), array('[', ']'), htmlspecialchars($test[3][$i])) . $test[2][$i];
}
}
if (in_array(strtolower($tag[1]), $allowed_html_tags))
{
return '<' . $tag[1] . $attributes . '>';
}
else
{
return htmlspecialchars('<' . $tag[1] . $attributes . '>');
}
}
// Finally, this is not an allowed tag so strip all the attibutes and escape it
else
{
return htmlspecialchars('<' . $tag[1] . '>');
}
}
{
global $board_config;
if (empty($tag[0]))
{
return '';
}
$allowed_html_tags = preg_split('/, */', strtolower($board_config['allow_html_tags']));
$disallowed_attributes = '/^(?:style|on)/i';
// Check if this is an end tag
preg_match('/<[^\w\/]*\/[\W]*(\w+)/', $tag[0], $matches);
if (sizeof($matches))
{
if (in_array(strtolower($matches[1]), $allowed_html_tags))
{
return '</' . $matches[1] . '>';
}
else
{
return htmlspecialchars('</' . $matches[1] . '>');
}
}
// Check if this is an allowed tag
if (in_array(strtolower($tag[1]), $allowed_html_tags))
{
$attributes = '';
if (!empty($tag[2]))
{
preg_match_all('/[\W]*?(\w+)[\W]*?=[\W]*?(["\'])((?:(?!\2).)*)\2/', $tag[2], $test);
for ($i = 0; $i < sizeof($test[0]); $i++)
{
if (preg_match($disallowed_attributes, $test[1][$i]))
{
continue;
}
$attributes .= ' ' . $test[1][$i] . '=' . $test[2][$i] . str_replace(array('[', ']'), array('[', ']'), htmlspecialchars($test[3][$i])) . $test[2][$i];
}
}
if (in_array(strtolower($tag[1]), $allowed_html_tags))
{
return '<' . $tag[1] . $attributes . '>';
}
else
{
return htmlspecialchars('<' . $tag[1] . $attributes . '>');
}
}
// Finally, this is not an allowed tag so strip all the attibutes and escape it
else
{
return htmlspecialchars('<' . $tag[1] . '>');
}
}
Надеюсь сами разберетесь.