2013-07-19 45 views
0

我想從HTML文檔中的腳本標記中僅提取javascript,我想將它傳遞給JS解析器,如esprima。我正在使用nodejs編寫該應用程序,並將內容從腳本標記中提取爲字符串。 問題是,當我想從HTML文檔中提取的JavaScript中有HTML註釋時,我想要刪除它。
<!-- var a; -->應轉換爲var a
一個簡單的去除<---->不起作用,因爲它的情況下<!-- if(j-->0); -->它消除了中間-->
我也想去掉標識符像[if !IE][endif]它們有時會發現失敗內部腳本標籤。 我也想提取JS內部的CDATA段。
<![CDATA[ var a; ]]>應該轉換爲var a
這一切都可能使用正則表達式還是更需要?
總之,我想從腳本標記中清理JS,以便我可以安全地將它傳遞到像esprima這樣的解析器。
謝謝!編號:
基於@ user568109的回答。這是粗略的代碼,通過HTML註釋和CDATA段解析腳本內標籤
只從腳本標記中提取javascript

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

您可以使用正則表達式來執行此操作。在你的瀏覽器中試試這個簡單的正則表達式...'「<! - if test(j - > 3) - >」替換(/^ $/g,「$ 1」)'並完成你的工作。 – mohkhan

+0

是否有一個更系統的方法來做到這一點,因爲似乎有這麼多的情況下,沒有有效的JS內部腳本標記。 CDATA和htmlcomments只是我到目前爲止遇到的一些案例。 – everconfusedGuy

+0

'很多情況下,沒有有效的JS內部腳本標記。'如果它不是有效的JS,有什麼意思將它們拉出來? – kennypu

回答

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

輸出(簡化):

​​

它會給你所有的標籤的div,評論,劇本等,但你必須驗證腳本里面的評論自己。另外CDATA是XML(XHTML)中的有效標籤,因此htmlparser2會將其作爲註釋檢測出來,您也必須檢查它們。

+0

我正在嘗試在http://htmlparser.forbeslindesay.co.uk/演示它不能識別腳本標記內的CDATA段! – everconfusedGuy

+0

哦,我剛剛發現一個事件'oncdata'..guess我可以用它來找出cdata塊的內容..感謝您的回答! – everconfusedGuy