HtmlPurifier - 允许数据属性

时间:2015-03-27 16:20:36

标签: php filter htmlpurifier

我正在尝试为所有data-attribute允许使用htmlPurifier span,但不能......

我有这个字符串:

<p>
    <span data-time-start="1" data-time-end="5" id="5">
       <word class="word">My</word>
       <word class="word">Name</word>
    </span>
    <span data-time-start="6" data-time-end="15" id="88">
       <word class="word">Is</word>
       <word class="word">Zooboo</word>
    </span>
<p>

我的htmlpurifier配置:

$this->HTMLpurifierConfigInverseTransform = \HTMLPurifier_Config::createDefault();
$this->HTMLpurifierConfigInverseTransform->set('HTML.Allowed', 'span,u,strong,em');
$this->HTMLpurifierConfigInverseTransform->set('HTML.ForbiddenElements', 'word,p');
$this->HTMLpurifierConfigInverseTransform->set('CSS.AllowedProperties', 'font-weight, font-style, text-decoration');
$this->HTMLpurifierConfigInverseTransform->set('AutoFormat.RemoveEmpty', true);

我这样净化$value

$purifier = new \HTMLPurifier($this->HTMLpurifierConfigInverseTransform);
var_dump($purifier->purify($value));die;

得到这个:

<span>My Name</span><span>Is Zoobo</span>

但是如何在我的id中保存我的数据属性data-time-startdata-time-endspan

我需要这个:

<span data-time-start="1" data-time-end="5" id="5">My Name</span data-time-start="6" data-time-end="15" id="88"><span>Is Zoobo</span>

我尝试使用此配置进行测试:

$this->HTMLpurifierConfigInverseTransform->set('HTML.Allowed', 'span[data-time-start],u,strong,em');

但错误消息:

  

用户警告:元素'span'中的属性'data-time-start'不是   支持(有关实现此信息,请参阅支持   论坛)

感谢您的帮助!!

编辑1

我尝试使用此代码行在firdt时间允许ID:

$this->HTMLpurifierConfigInverseTransform->set('Attr.EnableID', true);

这对我不起作用......

编辑2

对于data-*属性,我添加了这一行但是没有发生任何事情......

$def = $this->HTMLpurifierConfigInverseTransform->getHTMLDefinition(true);
$def->addAttribute('sub', 'data-time-start', 'CDATA');
$def->addAttribute('sub', 'data-time-end', 'CDATA');

1 个答案:

答案 0 :(得分:8)

HTML Purifier知道HTML的结构,并将此知识用作其白名单过程的基础。如果您将标准属性添加到白名单,它不允许该属性的任意内容 - 它理解该属性,并仍然会拒绝无意义的内容。

例如,如果您的某个属性采用了数值,HTML Purifier仍然会拒绝尝试输入值的HTML&#39; foo&#39;对于那个属性。

如果添加自定义属性,只需将其添加到白名单中,就不会教HTML HTML如何处理属性:它们在这些属性中可以期待哪些数据?什么数据是恶意的?

有大量文档,您可以在此处告诉HTML Purifier有关自定义属性的结构:Customize

&#39;目标&#39;的代码示例<a> - 标记的属性:

$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.DefinitionID', 'enduser-customize.html tutorial');
$config->set('HTML.DefinitionRev', 1);
$config->set('Cache.DefinitionImpl', null); // remove this later!
$def = $config->getHTMLDefinition(true);
$def->addAttribute('a', 'target', 'Enum#_blank,_self,_target,_top');

这会将target添加为仅接受值"_blank""_self""_target""_top"的字段。这比实际的HTML定义要严格得多,但对于大多数用途来说完全足够了。

这是您需要为data-time-startdata-time-end采取的一般方法。有关可能的配置,请查看官方HTML Purifier文档(如上所述)。我最好的猜测是你不想要Enum#...而是Number,就像这样......

$def->addAttribute('span', 'data-time-start', 'Number');
$def->addAttribute('span', 'data-time-end', 'Number');

...但请检查一下,看看哪种用例最适合您的用例。 (虽然您正在实施此功能,但请不要忘记您还需要在当前正在执行的白名单中列出属性。)

对于id,您应该在配置中加入Attr.EnableID = true

我希望有所帮助!