最近項目需要,要弄個正則表達式獲取body的內容。
用過angularjs就知道,很多時候要寫指令時引用templateUrl的時候。template的內容root是不能包含多個節點的,否則就報錯。
這樣的規范很不好,很多時候還是想保留template的頭,文檔類型,css等信息。
所以在開發模式下,希望angularjs加載模板的時候,自動砍掉頭部和尾部.
獲取之前:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script src="CssScriptLoader.js"></script> <script src="XZClass.js"></script> </head> <body> <div>內容</div> </body> </html>
希望的結果:
<div>內容</div>
所以正則表達式如下:
var REG_BODY = /<body[^>]*>([\s\S]*)<\/body>/; function getBody(content){ var result = REG_BODY.exec(content); if(result && result.length === 2) return result[1]; return content; }
這里遇到了個問題,match和exec的區別:
match是返回所有匹配的字符串合成的數組,但是正則表達式必須指定全局g屬性才能返回所有匹配,不指定g屬性則會返回一個只有一個元素的數組。
exec永遠返回與第一個匹配相關的信息,其返回數組包括第一個匹配的字串,所有分組的反向引用。
開始的時候,正則表達式后面我加了g,使用了match,死活獲取不到括號內的內容,莫名其妙,后面搜了match exec。我去,這兩個基友的區別真大!都怪當時看JAVASCRIPT權威指南的時候太傲,忽略了細節。以后絕對要細心。