Ответ 1
HTMLPurifier с CSSTidy делает что вы ищете.
HTMLPurifier в первую очередь предназначен для дезинфекции HTML, но также имеет возможность извлекать блоки стилей с помощью CSSTidy.
Вот пример в документах HTMLPurifier (но, увы, я использовал две мои ссылки за сообщение.)
Здесь другой:
require_once './htmlpurifier/library/HTMLPurifier.auto.php';
require_once './csstidy/class.csstidy.php';
// define some css
$input_css = "
body {
margin: 0px;
padding: 0px;
/* JS injection */
background-image: url(javascript:alert('Injected'));
}
a {
color: #ccc;
text-decoration: none;
/* dangerous proprietary IE attribute */
behavior:url(hilite.htc);
/* dangerous proprietary FF attribute */
-moz-binding: url('http://virus.com/htmlBindings.xml');
}
.banner {
/* absolute position can be used for phishing */
position: absolute;
top: 0px;
left: 0px;
}
";
// Create a new configuration object
$config = HTMLPurifier_Config::createDefault();
$config->set('Filter.ExtractStyleBlocks', TRUE);
// Create a new purifier instance
$purifier = new HTMLPurifier($config);
// Turn off strict warnings (CSSTidy throws some warnings on PHP 5.2+)
$level = error_reporting(E_ALL & ~E_STRICT);
// Wrap our CSS in style tags and pass to purifier.
// we're not actually interested in the html response though
$html = $purifier->purify('<style>'.$input_css.'</style>');
// Revert error reporting
error_reporting($level);
// The "style" blocks are stored seperately
$output_css = $purifier->context->get('StyleBlocks');
// Get the first style block
echo $output_css[0];
И результат:
body {
margin:0;
padding:0;
}
a {
color:#ccc;
text-decoration:none;
}
.banner {
}