我试图在我的所有范围内允许使用htmlPurifier的一些数据属性但是没办法…
我有这个字符串:
<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-start,data-time-end?
我需要这个:
<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');
但错误信息:
User Warning: Attribute ‘data-time-start’ in element ‘span’ not
supported (for information on implementing this, see the support
forums)
谢谢你的帮助 !!
编辑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');
解决方法:
HTML Purifier了解HTML的结构,并将此知识用作其白名单过程的基础.如果您将标准属性添加到白名单,它不允许该属性的任意内容 – 它理解该属性并仍将拒绝无意义的内容.
例如,如果某个属性采用了数值,HTML Purifier仍会拒绝尝试为该属性输入值’foo’的HTML.
如果添加自定义属性,只需将其添加到白名单中并不能教会HTML Purifier如何处理属性:它们可以在这些属性中获得哪些数据?什么数据是恶意的?
有大量文档,您可以在此处告诉HTML Purifier有关自定义属性的结构:Customize
< a> -tag的’target’属性有一个代码示例:
$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定义要严格得多,但对于大多数用途来说完全足够了.
这是数据时间开始和数据时间结束所需的一般方法.有关可能的配置,请查看官方HTML Purifier文档(如上所述).从你的例子中我最好的猜测是你不想要Enum#…但是数字,就像这样……
$def->addAttribute('span', 'data-time-start', 'Number');
$def->addAttribute('span', 'data-time-end', 'Number');
…但请检查一下,看看哪种用例最适合您的用例. (当您实现此功能时,请不要忘记您还需要在当前正在执行的白名单中列出属性.)
对于id,您应该在配置中包含Attr.EnableID = true
.
我希望有所帮助!