【问题标题】:Finding malformed XHTML with Javascript使用 Javascript 查找格式错误的 XHTML
【发布时间】:2009-06-11 03:41:49
【问题描述】:

有没有人有一个使用 Javascript 查找字符串是否包含格式错误的 XHTML 的好方法?

由于我的页面允许“用户”生成的 XHTML 返回(用户可以被信任)并将其注入 DOM,我想要一种方法来检查是否有未关闭或过度关闭的标签,并且将它们编码为<>,以便将错误简单地显示为文本。这样所有有效的 xhtml 仍然会显示,而无效的将简单地成为文本节点,允许脚本至少继续错误。


这是我做的类似方法,比较粗糙。它有一个不同的目的(只是剥离所有有效的 xhtml 标签并保留其余标签。它通过递归选择最里面的标签并将它们剥离出来。

stripHTML: function(html) {
   var validXHTML = /<(\S+).*>(.*?)<\/\1>/i;
   var validSelfClose = /<(input|img|br|hr)[^>]*\/>/gi;

   html = html.replace(validSelfClose, '');

   if(validXHTML.test(html)) {
    var loc = html.search(validXHTML);
    var str = html.match(validXHTML);
    html = html.substr(0, loc) + 
            strings.addPunctuation(html.substr(loc, str[0].length).replace(validXHTML, '$2')) + 
            html.substr((loc+str[0].length), html.length);

    if(validXHTML.test(html)) { 
        html = strings.stripHTML(html);
    } else {
        return html;
    }
   }
   return html;
}

请随意改进上述内容,或回答实际问题。


更新

我的想法至少可以适应大多数情况的简单方法是这样的:

encode all > 和

将内的所有标签名改为小写

递归工作,从最里面的标签开始,将它们从小写更改为大写 &lt;li&gt;something&lt;/li&gt; 变为 &lt;LI&gt;something&lt;/LI&gt;

递归结束后,去掉所有其他的 > 和

将所有大写标签切换回小写

除了需要相当长的时间之外,是否可以立即预见到任何问题?

【问题讨论】:

  • 尝试在 refactormycode.com 中发布代码
  • 任何此类程序都会遇到的一个问题是确定哪些标签是错误标签...考虑片段 hi;您要编码哪些标签?
  • @Strobor,我很懒,但我会在许多不同的浏览器中尝试特定的代码,看看它们做了什么。我怀疑他们中的大多数人会在内部将其理解为 hi
  • "任何此类程序都会遇到的一个问题是确定哪些标签是错误的...考虑片段 hi;您想对标签进行编码吗?”在所有嵌套标签终止之前终止的任何内容,或在其父标签终止之前未终止的任何内容。在这种情况下,应删除所有标签。

标签: javascript html regex xhtml tags


【解决方案1】:

我在服务器上使用 HTMLTidy 进行此操作

htmltidy -asxhtml

【讨论】:

  • 似乎是一个不错的项目,但我不能将它用作 xhtml 页面的一部分。
  • 但是既然您已经在另一条评论中说过您正在使用 XHR,您就不能将格式错误的 (x)html 发布到您自己的 tidy.cgi 中吗? htmltidy 几乎可以修复任何东西,而它不能修复你的脚本的东西可能不会好得多。当然,提交/保存操作可能会增加 2 秒,但这真的会成为问题吗?
  • 顺便说一句,有一个名为 jTidy 的项目可能可以作为 Java 小程序“现场”运行,但我认为该项目没有得到积极维护,我没有使用它。
  • 嗯,它是 xhtml+voice 应用程序的一部分,它已经调用了一个 cgi I 脚本来解释一个 haskell 程序。在我允许解析之前,必须“验证”整个返回,这必须通过同步 ajax 请求来完成,否则 vxml 在它有任何输出之前启动。增加两秒钟会使浏览器额外挂起两秒钟,不好!此外,我必须将其包含在一个文件中 :( 可悲的是,约束不是我的。
  • 2 秒纯属推测,旨在描述 HTML 往返成本(因为 tidy 应该在毫秒内完成)。如果您已经在往返数据,那么您可以在输出/验证过程中添加一个整洁的阶段。实际上,它最终可能比纯 JS 方法更快,尤其是在您依赖正则表达式的情况下。测试一下看看。
【解决方案2】:

那么 HTML 生成是否也在客户端发生?最好是在源本身验证生成的标记。

如果没有,也许有办法对 W3C 验证器进行编程。

http://validator.w3.org/#validate_by_input

另见, http://www.w3.org/QA/Tools/

【讨论】:

  • 加载后生成 html,通过使用 xmlhttp 从脚本文件中获取。我必须能够在现场验证它,将它发送到 w3c 并等待响应不会到期。更不用说我只需要验证标签,而不是文档,因为 w3c 总是将标签输入返回为无效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 2010-10-01
  • 2011-07-04
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多