【问题标题】:Finding comments in HTML在 HTML 中查找注释
【发布时间】:2012-10-09 22:52:28
【问题描述】:

我有一个 HTML 文件,其中可能有 Javascript、PHP 以及人们可能会或可能不会放入他们的 HTML 文件中的所有这些东西。

我想从这个 html 文件中提取所有 cmets。

我可以指出这样做的两个问题:

  1. 一种语言的评论可能不是另一种语言的评论。

  2. 在 Javascript 中,使用 // 标记将其余行注释掉。但是 URL 中也包含 //,因此如果我删除部分 URL 只需申请替换 // 然后 该行的其余部分,没有任何内容。

所以这不是一个小问题。

是否有任何可用的解决方案?

有人已经这样做了吗?

【问题讨论】:

  • 你说得对,这不是微不足道的。为了可靠地删除 cmets,您需要完全解析文件(PHP、HTML 和 Javascript)。如果可能,我建议使用 PHP;虽然我更喜欢 Perl,但 PHP 本身的工具比 Perl 的 PHP 工具要好。这里有一些东西可以帮助您入门:stackoverflow.com/questions/503871/…。然后你只需要在 PHP 中找到 HTML 和 javascript 解析器来对文件的这些部分做同样的事情。
  • 为什么要在 HTML 文件中使用 PHP?我你只有 CSS、JavaScript 和 HTML,然后谷歌“HTML Minifier”寻找可以删除 cmets、空白和通常“缩小”你的页面的产品。
  • @RB,要解析的 html 可能在某些时候甚至不是我的。
  • 你的第 2 点正是我总是在我的 cmets 中使用 /// 的原因——只是一个随机点,但我之前遇到过这个问题,它永远改变了我的评论习惯;)什么是你需要这种能力的原因是什么? “提取”是指保留 cmets 还是丢弃它们?
  • 好吧,我打算丢弃它们,但不拘泥于对它们这样做将是一个更加模块化的解决方案。

标签: javascript html perl comments


【解决方案1】:

我会将 HTML 文件转换为字符数组并对其进行解析。当您向前移动并跳过或删除这些段时,您可以检测到诸如“

必须正确识别开始/结束索引,这是一个挑战,但您将拥有全部权力。

如果性能不是问题,还有其他方法可以简化流程。例如,可以使用 XML::Twig 抓取所有标签,并且可以解析字符串以检测 JS cmets。

【讨论】:

    【解决方案2】:

    查看像 ANTLR 这样的解析器生成器,它有 many languages 的语法,并编写一个嵌套解析器来可靠地找到 cmets。如果准确性很重要,正则表达式不会对您有所帮助。即使那样,它也不会 100% 准确。

    考虑

    问题 3,一种语言的评论并不总是一种语言的评论。

    <textarea><!-- not a comment --></textarea>
    <script>var re = /[/*]not a comment[*/]/, str = "//not a comment";</script>
    

    问题 4,嵌入在语言中的评论可能显然不是评论。

    <button onclick="&#47;&#47; this is a comment//&#10;notAComment()">
    

    问题5,什么是注释可能取决于浏览器的配置方式。

    <noscript><!-- </noscript> Whether this is a comment depends on whether JS is turned on -->
    <!--[if IE 8]>This is a comment, except on IE 8<![endif]-->
    

    我必须为上下文模板系统部分解决这个问题,从源代码中删除 cmets 以防止泄漏软件实现细节。

    https://github.com/mikesamuel/html-contextual-autoescaper-java/blob/master/src/tests/com/google/autoesc/HTMLEscapingWriterTest.java#L1146 显示了一个测试用例,其中注释在 JavaScript 中标识,后来的测试用例显示在 CSS 和 HTML 中标识的 cmets。您也许可以修改该代码以查找 cmets。它不会处理 PHP 代码段中的 cmets。

    【讨论】:

      【解决方案3】:

      问题 2:当您用任何一种语言编写时,不是每个 url 都被引用,用“www.url.com”或“www.url.com”吗?我不知道。如果是这种情况,那么您要做的就是解析代码并检查反斜杠之前是否有任何引号,以了解它是真正的 url 还是只是评论。

      【讨论】:

      • 所以你解决了这个问题?如果不是(也许我没有正确理解您的问题),那么问题是什么? :)
      • 没有。 URL 没有被可靠地引用。 &lt;a href=http://www.google.com&gt; 是一个反例。 &lt;style&gt;body { background: url(http://example.com/bg.png) }&lt;/style&gt; 是另一个。
      • 我根本没有解决这个问题,我正在研究一种适用于我目前需求的低级解决方案,只删除单行 javascript cmets 等等。拥有一个可以将 html 放入其中并获得其中的 cmets 的单个函数的梦想,所有问题都已解决......仍然是一个梦想。
      【解决方案4】:

      从您的话看来,您正在考虑一些基于正则表达式的方法:在整个文件上这样做是很痛苦的,尝试使用一些工具突出显示或丢弃有趣或无趣的文本,然后处理什么根据保留/丢弃标准从您的筛子中留下。看看 HTML::Tree 和 TreeBuilder,处理 HTML 标记可能非常有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-31
        • 1970-01-01
        • 2020-10-10
        • 1970-01-01
        • 2022-01-23
        • 2021-09-28
        相关资源
        最近更新 更多