符合 HTML5 的 HTML 过滤器

HTML filter that is HTML5 compliant

提问人:mario 提问时间:4/15/2011 最后编辑:mario 更新时间:8/9/2019 访问量:7412

问:

有没有一种简单的方法可以为 HTMLPurifier 添加 HTML5 规则集?

HP 可以配置为通过以下方式识别新标签:

// setup configurable HP instance
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.DefinitionID', 'html5 draft');
$config->set('HTML.DefinitionRev', 1);
$config->set('Cache.DefinitionImpl', null); // no caching
$def = $config->getHTMLDefinition(true);

// add a new tag
$form = $def->addElement(
  'article',   // name
  'Block',     // content set
  'Flow',      // allowed children
  'Common',    // attribute collection
  array(       // attributes
  )
);

// add a new attribute
$def->addAttribute('a', 'contextmenu', "ID");

然而,这显然是一项艰巨的工作。因为有很多新的HTML5标签和属性必须注册。即使与现有的 HTML 4 标记,新的全局属性也应该可以组合。(很难从文档中判断如何增强核心规则)。那么,有没有更有用的配置格式/数组结构来将新的更新的标签+属性+上下文配置(inline/block/empty/flow/..)馈送到HTMLPurifier中?

# mostly confused about how to extend existing tags:
$def->addAttribute('input', 'type', "...|...|...");

# or how to allow data-* attributes (if I actually wanted that):
$def->addAttribute("data-*", ...

当然,并非所有新的HTML5标签都适合不受限制的限额。HTMLPurifier 是关于内容过滤的。定义价值约束是它所在的地方。-- 例如,当它出现在用户内容中时,可能没什么大不了的。因为如果没有 Javascript(HP 已经过滤掉了),它充其量是无用的。但其他标签和属性可能是不可取的;因此,灵活的配置结构对于启用/禁用标签及其相关属性是必不可少的。<canvas>

(我想我应该更新一些研究......但是仍然没有适合 HP 配置的实用纲要/规范(不,XML DTD 不是)。

(呃,HTML5 不再是草稿了。

php html htmlpurifier

评论

0赞 thirtydot 4/18/2011
你有没有问过谁能做到?stackoverflow.com/questions/4566301/......
0赞 mario 4/18/2011
@thirtydot:那可能是在他添加PH5P解析器之前。无论如何,这无关紧要,因为您可以添加新标签,并且 HTML4 解析技术应该在 HTML5 上运行良好。
2赞 Eugene 4/23/2011
您应该知道 HTML 5 仍然是一个草案(即使它已经处于“最后通话”状态超过 2 年)......因此可以改变......因此,今天的 HTML 5 不一定是明天的 HTML 5。
2赞 Edward Z. Yang 7/18/2011
正如马里奥所指出的,主要问题在于梳理所有属性并手动批准它们。这是一件好事,因为我非常仔细地审查了 HTML Purifier 当前属性集中的每一个属性。这是一些跑腿工作,但对于一个有足够动力的人来说,这应该不会太难。唉,我现在不是那个人。
1赞 Edward Z. Yang 8/3/2011
(这是我不喜欢赏金系统的原因之一:对于一个足够困难的问题,有人可能会因为错误的答案而获得赏金:-)

答:

12赞 chris 4/17/2011 #1

php tidy 扩展可以配置为识别 html5 标签。http://tidy.sourceforge.net/docs/quickref.html#new-blocklevel-tags

评论

0赞 chris 4/18/2011
您可以将整洁的 cleanAndRepair 包装在自己的类中,并将其与 strip_tags 和 htmlspecialchars 混合使用。Tidy 还有一个裸露的选项,可以剥离专有属性,也许这会有所帮助。
7赞 mario 4/19/2011
tidy_clean_repair()可能最适合只重新格式化您自己的代码。drop-proprietary-attributes 标志有趣地删除了任何新的 HTML5 属性,但保留了 onClick= 等。所以它真的不是 HTMLPurifier 的替代品。
0赞 Levi Morrison 11/12/2011
但是,您可以使用 and such 来定义它们。new-block-tags
4赞 braindamage 8/2/2011 #2

我正在使用 wordpress 的修复程序,但也许这也可以帮助您(至少对于数组部分)

http://nicolasgallagher.com/using-html5-elements-in-wordpress-post-content/

http://hybridgarden.com/blog/misc/adding-html5-capability-to-wordpress/

也:

http://code.google.com/p/html5lib/Python 和 PHP 的实现 基于 WHATWG HTML5 规范的 HTML 解析器,最大 与主要桌面 Web 浏览器的兼容性。

评论

0赞 mario 8/2/2011
不确定 WP 片段,但 html5lib 听起来很有前途。它可能没有 HP 功能集,但至少可以成为出色的过渡解决方案。
0赞 Evan Mulawski 8/2/2011 #3

Gallery Role 有一个基于 HTMLPurifier 的实验性 HTML5 解析器:

https://github.com/gallery/gallery3-vendor/blob/master/htmlpurifier/modified/HTMLPurifier/Lexer/PH5P.php

评论

1赞 mario 8/2/2011
PH5P 是 HTMLPurifier 的一部分。然而,据我了解,它只是根据 HTML5 SGML 式序列化实现解析规则。我相信它并没有增强 HP 输出滤波器(或者只是没有让它工作)。@EZY可能还没有时间整合或完成它。
1赞 Edward Z. Yang 8/3/2011
如果需要,您可以将 PH5P 与 HTML Purifier 一起使用。但这并没有将您需要的属性集添加到 HTML Purifier 中。
7赞 Christoffer Bubach 5/6/2015 #4

HTMLpurify 有此配置以允许更新的 HTML5 标记。

来源:https://github.com/kennberg/php-htmlpurfier-html5

.

<?php
/**
 * Load HTMLPurifier with HTML5, TinyMCE, YouTube, Video support.
 *
 * Copyright 2014 Alex Kennberg (https://github.com/kennberg/php-htmlpurifier-html5)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

require_once(LIB_DIR . 'third-party/htmlpurifier/HTMLPurifier.safe-includes.php');


function load_htmlpurifier($allowed) {
  $config = HTMLPurifier_Config::createDefault();
  $config->set('HTML.Doctype', 'HTML 4.01 Transitional');
  $config->set('CSS.AllowTricky', true);
  $config->set('Cache.SerializerPath', '/tmp');

  // Allow iframes from:
  // o YouTube.com
  // o Vimeo.com
  $config->set('HTML.SafeIframe', true);
  $config->set('URI.SafeIframeRegexp', '%^(http:|https:)?//(www.youtube(?:-nocookie)?.com/embed/|player.vimeo.com/video/)%');

  $config->set('HTML.Allowed', implode(',', $allowed));

  // Set some HTML5 properties
  $config->set('HTML.DefinitionID', 'html5-definitions'); // unqiue id
  $config->set('HTML.DefinitionRev', 1);

  if ($def = $config->maybeGetRawHTMLDefinition()) {
    // http://developers.whatwg.org/sections.html
    $def->addElement('section', 'Block', 'Flow', 'Common');
    $def->addElement('nav',     'Block', 'Flow', 'Common');
    $def->addElement('article', 'Block', 'Flow', 'Common');
    $def->addElement('aside',   'Block', 'Flow', 'Common');
    $def->addElement('header',  'Block', 'Flow', 'Common');
    $def->addElement('footer',  'Block', 'Flow', 'Common');

    // Content model actually excludes several tags, not modelled here
    $def->addElement('address', 'Block', 'Flow', 'Common');
    $def->addElement('hgroup', 'Block', 'Required: h1 | h2 | h3 | h4 | h5 | h6', 'Common');

    // http://developers.whatwg.org/grouping-content.html
    $def->addElement('figure', 'Block', 'Optional: (figcaption, Flow) | (Flow, figcaption) | Flow', 'Common');
    $def->addElement('figcaption', 'Inline', 'Flow', 'Common');

    // http://developers.whatwg.org/the-video-element.html#the-video-element
    $def->addElement('video', 'Block', 'Optional: (source, Flow) | (Flow, source) | Flow', 'Common', array(
      'src' => 'URI',
      'type' => 'Text',
      'width' => 'Length',
      'height' => 'Length',
      'poster' => 'URI',
      'preload' => 'Enum#auto,metadata,none',
      'controls' => 'Bool',
    ));
    $def->addElement('source', 'Block', 'Flow', 'Common', array(
      'src' => 'URI',
      'type' => 'Text',
    ));

    // http://developers.whatwg.org/text-level-semantics.html
    $def->addElement('s',    'Inline', 'Inline', 'Common');
    $def->addElement('var',  'Inline', 'Inline', 'Common');
    $def->addElement('sub',  'Inline', 'Inline', 'Common');
    $def->addElement('sup',  'Inline', 'Inline', 'Common');
    $def->addElement('mark', 'Inline', 'Inline', 'Common');
    $def->addElement('wbr',  'Inline', 'Empty', 'Core');

    // http://developers.whatwg.org/edits.html
    $def->addElement('ins', 'Block', 'Flow', 'Common', array('cite' => 'URI', 'datetime' => 'CDATA'));
    $def->addElement('del', 'Block', 'Flow', 'Common', array('cite' => 'URI', 'datetime' => 'CDATA'));

    // TinyMCE
    $def->addAttribute('img', 'data-mce-src', 'Text');
    $def->addAttribute('img', 'data-mce-json', 'Text');

    // Others
    $def->addAttribute('iframe', 'allowfullscreen', 'Bool');
    $def->addAttribute('table', 'height', 'Text');
    $def->addAttribute('td', 'border', 'Text');
    $def->addAttribute('th', 'border', 'Text');
    $def->addAttribute('tr', 'width', 'Text');
    $def->addAttribute('tr', 'height', 'Text');
    $def->addAttribute('tr', 'border', 'Text');
  }

  return new HTMLPurifier($config);
}

评论

0赞 mario 5/6/2015
不错的发现。但是,您可能希望摘录相关部分,并注明基本归属。链接经常变得无法访问(特别是对于github;它很少有互联网存档缓存)。-- 它至少注册了基本标签;但是缺少许多新属性,例如仅列出一些当选的 data-* 道具。
0赞 Christoffer Bubach 5/6/2015
注意到,完整的列表现在包含在帖子中。
0赞 BurninLeo 10/18/2016
很酷的脚本。HTML Purifier 似乎仍然删除 <video> 标签中的(替代)文本内容,尽管配置告诉不要这样做(“Flow”)。有什么想法,为什么?
3赞 xemlock 8/9/2019 #5

我知道这个话题真的很老,但由于它仍然相关,我决定做出回应。特别是当情况自最初提出问题以来发生了变化时。

您可以使用 https://github.com/xemlock/htmlpurifier-html5,它使用符合规范的 HTML5 元素和属性定义来扩展 HTML Purifier。

用法和原来的HTML净化器差不多,你只需要换成:HTMLPurifier_ConfigHTMLPurifier_HTML5Config

$config = HTMLPurifier_HTML5Config::createDefault();
$purifier = new HTMLPurifier($config);

$clean_html5 = $purifier->purify($dirty_html5);

免責聲明:我是扩展的作者。