如何在 HTML Purifier 中删除 img 标签的 alt 属性?

问题描述 投票:0回答:2

默认情况下,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
属性?

htmlpurifier
2个回答
1
投票

您所观察到的现象源于根据标准,

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 代码的好途径。 :)


0
投票
如果有人仍然需要快速解决方案,请参阅下文。请注意,这些定义上的转换是在实例化 HTMLPurifier 之后完成的。

重要的是,这消除了对 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; }); }


© www.soinside.com 2019 - 2024. All rights reserved.