我想从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}}
答案 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会将其检测为注释,您也必须检查它们。