8

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

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

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

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

  2. //在 Javascript 中,使用标记将其余行注释掉。但是 URL 也包含//在其中,因此如果我只应用替换//,然后应用该行的其余部分,我很可能会删除部分 URL,什么都没有。

所以这不是一个小问题。

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

有人已经这样做了吗?

4

4 回答 4

2

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

于 2012-10-19T15:04:10.893 回答
1

查看像 ANTLR 这样的解析器生成器,它具有多种语言的语法,并编写一个嵌套解析器来可靠地查找注释。如果准确性很重要,正则表达式不会对您有所帮助。即便如此,它也不会是 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]-->

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

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

于 2012-10-19T15:15:20.213 回答
0

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

于 2012-10-19T12:34:09.603 回答
0

我会将 HTML 文件转换为字符数组并解析它。当您向前移动并跳过或删除这些段时,您可以检测到诸如“<”、“--”、“www”、“http”之类的关键字符串。

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

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

于 2012-10-21T21:40:29.927 回答