默认情况下,HTML Purifier 会为每个
alt
标签添加一个 img
属性(非常烦人的行为)。所以
<img src="123.jpg" />
成为
<img src="123.jpg" alt="123.jpg" />
文档提到了 Attr.DefaultImageAlt 选项。它默认为 NULL,表示使用
src
属性的基本名称作为 alt
。当我将 Attr.DefaultImageAlt
设置为空字符串时,结果变为
<img src="123.jpg" alt="" />
任何人都可以建议如何完全摆脱
alt
属性?
您所观察到的现象源于根据标准,
alt
属性对于img
标签是强制性的,并且 HTML Purifier 考虑了标准。
这意味着 HTML Purifier,除非您调整其基本 HTML 处理行为(无论是通过修补 HTML Purifier,还是通过覆盖其对某些标签或属性的理解),否则无法放弃
alt=
属性。
(浏览器实际上有类似的行为,尽管可能不那么明显 - 如果您删除
alt=
,它们仍然会使用内部 alt=
值。)
如果此信息没有改变您对如何处理该属性的看法,请继续阅读:
(即通过更改 HTML Purifier 源代码来更改行为。)
如果您想修补 HTML Purifier 以允许alt
不存在,您应该修补library/HTMLPurifier/AttrTransform/ImgRequired.php。您还可以看到如何使用
Attr.DefaultImageAlt
指令 - 如果您提供
null
值(而不是空字符串),文件名的一部分将用作
alt
值。压倒一切
(即更改行为而不更改 HTML Purifier 源代码。)
如果您想覆盖 HTML Purifier 行为,请查看 HTML Purifier 站点上的Customize! 文档。
未经测试,我相信您需要进行两项更改才能覆盖您看到的行为:
1) 将 alt
设为非强制性:
$htmlDef = $this->configuration->getHTMLDefinition(true);
$htmlDef->addAttribute('img', 'alt', new HTMLPurifier_AttrDef_Text());
缺少
*
应该会对你有所帮助。
2) 删除或替换 ImgRequired
属性转换。您可以看到
HTMLPurifier_AttrTransform_ImgRequired
类最终注册到library/HTMLPurifier/HTMLModule/Image.php
中的
$htmlDef->info_attr_transform_post['img']
和
$htmlDef->info_attr_transform_pre['img']
。你应该能够做这样的事情:
$htmlDef->info_attr_transform_pre['img'] = array();
$htmlDef->info_attr_transform_post['img'] = array();
// You can *replace* the old behaviour with your own by writing
// your own class and loading it here:
// $htmlDef->info_attr_transform_pre['img'][] = new YourOwnClass();
// $htmlDef->info_attr_transform_post['img'][] = new YourOwnClass();
在实现此功能的过程中可能会遇到一些障碍(例如,该类可能会在与我刚才所说的略有不同的地方注册 - 自从我在这个级别上修改 HTML Purifier 以来已经有几年了!),但是这将为您提供一条了解 HTML Purifier 代码的好途径。 :)
重要的是,这消除了对 all
所需属性(包括 src)的检查,这对我来说没问题。如果这不是您想要的,您应该按照接受的答案中的描述创建自己的实现。
$purifier = new HTMLPurifier($config);
$def = $purifier->config->getHTMLDefinition();
if (isset($def->info['img'])) {
// remove checks for required attributes on img
$transform = &$def->info['img']->attr_transform_pre;
$transform = array_filter($transform, function($x) {
return !$x instanceof HTMLPurifier_AttrTransform_ImgRequired;
});
$transform = &$def->info['img']->attr_transform_post;
$transform = array_filter($transform, function($x) {
return !$x instanceof HTMLPurifier_AttrTransform_ImgRequired;
});
}