1// ES2015(ES6)2const fs =require('fs');34function*pickupScript(htmlFile){5const html = fs.readFileSync('./sample.html',{ encoding:'utf8'});6const elmatr =[7// イベントの一覧は例えばhttps://www.w3schools.com/tags/ref_eventattributes.asp8// などみて列挙すれば列挙できなくはないと思います。100個に届かないぐらいと思います。9// window10"onafterprint",11"onbeforeprint",12...13// misc14"onshow",15"ontoggle",16].map(eventName=>{17const p ='[^a-z_]'+ eventName +'\s*=\s*(["\'])(.+?)\1';18returnnewRegExp(p,'ig');19});20for(let re of elmatr){21for(let m; m = re.exec(html);){22yield m[2];23}24}2526// javascript以外であっても取り出してしまいます。27// 1行にscriptが1つしか書かれていないパターンしか想定していません。28// タグの構文は典型的と思えたパターンしか配慮していません。29const re2 =/^\s*<script(\s+[a-z]+\s*=["'].*?["'])*\s*>\s*$/i30const re3 =/^\s*</script>\s*$/i31let inside =false;32for(let line of html.split('\n')){33if(!inside)34 inside = line.match(re2);35else{36 inside =!line.match(re3);37if(inside)yield line;38}39}40}4142for(let g =pickupScript('./sample.html'), m; m = g.next().value;){43console.log(m);44}
const re4=/<script>(.+?)</script>/ig;
for (let m; m = re4.exec(html); ) {
yield m[1];
}
をpickupScript本体に追加するぐらいでしょうか。ただし上記のコードの意味を把握せずに使っていると落とし穴が(マッチできない・不当にマッチする)ことになりますのでそこはご注意を。yambejpさんがおっしゃるようにあくまで「そこそこの精度」でしかありませんので。
---すみません、typoあったので直しました。
退会済みユーザー
2017/11/23 07:27
ありがとうございます。正規表現苦手なので助かりました。
退会済みユーザー
2017/11/23 08:16
'''
const re2 = /^\s*<script(\s+[a-z]+\s*=["'].*?["'])*\s*>\s*$/i
const re3 = /^\s*</script>\s*$/i
const re4 = /<script>(.+?)</script>/i;
let inside = false;
let onelinescript = false;
for (let line of html.split('\n')) {
if (!inside){
inside = line.match(re2);
onelinescript = line.match(re4);
if(onelinescript){
// console.log(onelinescript[1]);
yield onelinescript[1];
onelinescript = false;
}
}else{
inside = !line.match(re3);
if (inside) yield line;
}
}
'''
先程のコードを参考に、上のように行が分かれているScriptタグを処理する部分でついでに、ワンラインのスクリプトタグも処理できるように改良しました。しかし、これでは<script>hogehoge()</script>は抜き出せても、<script type="text/javascript">hogehoge()</script>は抜き出せなかったので、re4の正規表現を
'''
const re4 = /<script(\s+[a-z]+\s*=["'].*?["'])*\s*>(.+?)</script>/i;
'''
このようにしたのですが、うまく抜き出せれません。訂正すべきところを教えてください。