2012-10-19 80 views
8

我有一个HTML文件,其中可能包含Javascript,PHP以及所有这些人可能会或可能不会放入其HTML文件的内容。在HTML中查找注释

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

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

  1. 什么是一个语言的评论可能不会出现在其他评论。

  2. 在Javascript中,其余行使用//标记进行了注释。但是其中的URL也包含//,因此我可以很好地删除部分网址,如果我只用//替换//,然后再用 替换该行的其余部分即可。

所以这不是一个小问题。

是否有任何解决方案可以满足这些需求?

有没有人已经这样做?

+3

你是对的,这不是微不足道的。为了可靠地删除注释,您需要完全解析文件(PHP,HTML和Javascript)。如果可能,我建议使用PHP;虽然我更喜欢Perl,但PHP的工具本身比Perl工具更好地处理PHP。这里是让你开始的东西:http://stackoverflow.com/questions/503871/best-way-to-automatically-remove-comments-from-php-code。然后,您只需在PHP中查找HTML和JavaScript解析器就可以对文件的这些部分进行同样的操作。 – dan1111

+0

为什么你会在你的HTML文件中使用PHP?我只有CSS,JavaScript和HTML,然后是谷歌的“HTML Minifier”,可以删除评论,空白和一般“瘦”你的网页的产品。 –

+1

@RB。预渲染? – Jivings

回答

0

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

2

问题2:是不是每个URL引用,或者用“www.url.com”或“www.url.com”,当你把它写在两种语言?我不确定。如果是这种情况,那么你所要做的就是解析代码,并检查反斜杠前面是否有引号,以知道它是一个真正的url还是一个注释。

+0

这实际上是我现在正在做的。 –

+0

所以你解决了这个问题?如果没有(也许我没有理解你的问题),问题是什么? :) –

1

查找到解析器生成像ANTLR具有语法为many languages,写一个嵌套解析器可靠地找到意见。如果准确性很重要,正则表达式不会帮助你。即使那样,它也不会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]--> 

我不得不部分地解决这个问题,从源代码注释的Elid防止泄漏软件实现细节的上下文模板系统。

https://github.com/mikesamuel/html-contextual-autoescaper-java/blob/master/src/tests/com/google/autoesc/HTMLEscapingWriterTest.java#L1146表示在注释中的JavaScript标识的测试用例,后来测试用例显示CSS和HTML鉴定意见。您可能可以修改该代码以查找评论。它不会处理PHP代码部分中的注释。

0

我会将HTML文件转换为字符数组并解析它。随着您前进并跳过或删除这些分段,您可以检测到诸如“<”,“ - ”,“www”,“http”等关键字符串。

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

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