仅从脚本标记中提取javascript

Extract only javascript from a script tag

本文关键字:提取 javascript 脚本      更新时间:2023-09-26

我只想从HTML文档中的脚本标记中提取javascript,并将其传递给像esprima这样的JS解析器。我正在使用nodejs编写这个应用程序,并将从脚本标记中提取的内容作为字符串。问题是从我想要删除的HTML文档中提取的javascript中存在HTML注释
<!-- var a; -->应转换为var a
简单移除<---->不起作用,因为它在移除中间-->的情况<!-- if(j-->0); -->中失败
我还想删除像[if !IE][endif]这样的标识符,它们有时会出现在脚本标记中。我还想提取CDATA段中的JS。
<![CDATA[ var a; ]]>应转换为var a
所有这些都可能使用正则表达式吗?还是需要更多的东西
简而言之,我想从脚本标记中清除JS,这样我就可以安全地将其传递到像esprima这样的解析器中
谢谢

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

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()

这是解析器的工作。请参阅htmlparser2或esprima本身。请不要使用正则表达式来解析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会将其检测为注释,您也必须检查这些标记。