仅从脚本标记中提取javascript

时间:2013-07-19 07:30:25

标签: javascript regex node.js

我想从HTML文档中的脚本标记中仅提取javascript,我想将其传递给像esprima这样的JS解析器。我使用nodejs编写此应用程序,并将从脚本标记中提取的内容作为字符串。 问题是当从我想删除的html文档中提取的javascript中有HTML注释时。
<!-- var a; -->应转换为var a
简单删除<---->不起作用,因为<!-- if(j-->0); -->-->移除中间[if !IE]的情况下失败了 我还想删除有时会在脚本代码中找到的[endif]<![CDATA[ var a; ]]>等标识符。 我还想在CDATA段中提取JS。
var a应转换为var htmlparser = require("htmlparser2"); var jstext = ''; var parser = new htmlparser.Pavar htmlparser = require("htmlparser2"); var jstext = ''; var parser = new htmlparser.Parser({ onopentag: function(name, attribs){ if(name === "script" && attribs.type === "text/javascript"){ jstext = ''; //console.log("JS! Hooray!"); } }, ontext: function(text) { jstext += text; }, onclosetag: function(tagname) { if(tagname === "script") { console.log(jstext); jstext = ''; } }, oncomment : function(data) { if(jstext) { jstext += data; } } }, { xmlMode:true }); parser.write(input); parser.end()
所有这些都可以使用正则表达式还是更需要的东西?
总之,我想从脚本标签中清理JS,以便我可以安全地将它传递给像esprima这样的解析器。
谢谢!

编辑:
根据@ user568109的回答。这是粗略的代码,用于解析脚本标记内的HTML注释和CDATA段

{{1}}

1 个答案:

答案 0 :(得分:0)

这是解析器的工作。请参阅htmlparser2或esprima本身。请don't use regex to parse HTML,这是诱人的。您将浪费宝贵的时间和精力来尝试匹配更多标签。

该页面的一个例子:

var htmlparser = require("htmlparser2");
var parser = new htmlparser.Parser({
    onopentag: function(name, attribs){
        if(name === "script" && attribs.type === "text/javascript"){
            console.log("JS! Hooray!");
        }
    },
    ontext: function(text){
        console.log("-->", text);
    },
    onclosetag: function(tagname){
        if(tagname === "script"){
            console.log("That's it?!");
        }
    }
});
parser.write("Xyz <script type='text/javascript'>var foo = '<<bar>>';</script>");
parser.end();

输出(简化):

--> Xyz 
JS! Hooray!
--> var foo = '<<bar>>';
That's it?!

它将为您提供所有标签div,注释,脚本等。但您必须自己验证评论中的脚本。另外CDATA是XML(XHTML)中的有效标记,因此htmlparser2会将其检测为注释,您也必须检查它们。