c# - 在大型 html 文档中为图像添加缺少的 alt 标签的最有效方法

标签 c# html accessibility

为了符合可访问性标准,我需要确保某些动态生成的 html(我无法控制)中的所有图像都具有空的 alt 标记(如果未指定的话)。

示例输入:

<html>
    <body>
          <img src="foo.gif" />
          <p>Some other content</p>
          <img src="bar.gif" alt="" />
          <img src="blah.gif" alt="Blah!" />
    </body>
</html>

期望的输出:

<html>
    <body>
          <img src="foo.gif" alt="" />
          <p>Some other content</p>
          <img src="bar.gif" alt="" />
          <img src="blah.gif" alt="Blah!" />
    </body>
</html>

html 可能非常大并且 DOM 嵌套很重,因此使用诸如 Html Agility Pack 之类的东西已经过时了。

谁能建议一种有效的方法来实现这一点?

更新:

可以安全地假设我正在处理的 html 格式正确,因此潜在的解决方案根本不需要考虑这一点。

最佳答案

您的问题似乎非常具体,您需要更改一些输出,但出于性能原因,您不想使用(类似通用的东西)HTMLAgilityPack 来解析整个问题。最好的解决方案似乎是用艰难的方式来做。

我只会暴力破解它。很难比这样更有效地做到这一点(完全未经测试,几乎可以保证不会按原样工作,但逻辑应该没问题,如果某处缺少“+1”或“-1”):

string addAltTag(string html) {
    StringBuilder sb = new StringBuilder();
    int pos=0;
    int lastPos=0;
    while(pos>=0) {
       int nextpos;
       pos=html.IndexOf("<img",pos);
       if (pos>=0) {
          // images can't have children, and there should not be any angle braces 
          // anyhere in the attributes, so should work fine
          nextPos =html.IndexOf(">",pos);

       }

       if (nextPos>0) {
          // back up if XML formed
          if (html.indexOf(nextPos-1,1)=="/") {
            nextPos--;
          }
           // output everything from last position up to but
           // before the closing caret
           sb.Append(html.Substring(lastPos,nextPos-lastPos-1);
           // can't just look for "alt" could be in the image url or class name
           if (html.Substring(pos,nextPos-pos).IndexOf(" alt=\"")<0) {
               sb.Append(" alt="\"\"");
           }
           lastPos=nextPos;
       } else {
           // unclosed image -- just quit
           pos=-1;
       }
    }
    sb.Append(html.Substring(lastPos);
    return sb.ToString();
}

您可能需要做一些事情,例如在测试之前转换为小写,解析或测试变体,例如 alt = "(即带空格)等,具体取决于您期望的一致性你的 HTML。

顺便说一句,这不可能更快,但如果你出于某种原因想使用更通用的东西,你也可以试试 CsQuery .这是我自己的 jQuery 的 C# 实现,它可以很容易地做这样的事情,例如

obj.Select("img").Not("[alt]").Attr("alt",String.Empty);

既然你说 HTML agility pack 在深度嵌套的 HTML 上表现不佳,那么这对你来说可能会更好,因为我使用的 HTML 解析器不是递归的,无论嵌套如何,它都应该线性执行。但这比仅仅根据您的确切需要编码要慢得多,因为它当然会将整个文档解析为一个对象模型。这对于您的情况是否足够快,谁知道呢。

关于c# - 在大型 html 文档中为图像添加缺少的 alt 标签的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7531465/

相关文章:

java - 当我的 HTML 文件位于 WebContent 文件夹中时,为什么在 Tomcat 7.0.70 上会出现错误 404(请求的资源不可用。)?

c# - 如果包含 X,则更改富文本框中的字符串颜色

c# - GetAuthorizationGroups() 抛出异常

c# - Xamarin 'Hello Android' Quickstart 无法在 Visual Studio 2015 中初始化 Nexus 5 KitKat

c# - MVC 下拉列表只读不起作用

html - Aria-label 不适用于带有 NVDA 的 Chrome 和 Firefox

html - 响应式切换导航栏 - 仅使用 css

html - 我们是否应该在现代浏览器时代使用 sprite sheet?

html - 为标记的图标图像提供替代文本是否有意义?

c# - 无法访问 VB 类文件...... friend 的事