こんにちは。
ご質問に
(書きながらそれ以外にも、文字列をparseHTMLしてDOMを取得してから文字列化する方法も思いつきました。)
とあったので、この回答では、上記の趣旨で、所与のHTMLからDOMを作って <script>
を取得するコードの一例を示します。たとえば、以下のような HTMLファイル test.html があるとします。
$ cat test.html
html
1<!DOCTYPE html>
2<html lang="ja">
3<head>
4 <meta charset="UTF-8">
5 <title>Test</title>
6 <script
7 src="https://code.jquery.com/jquery-3.4.1.min.js"
8 integrity="sha256-CSXorHvZcTNaix6yvo6HPPCzgETByMGWSFlBw8HfCJo="
9 crossorigin="anonymous"></script>
10 <script>
11 $(function() {
12 // something to do
13 });
14 </script>
15 <script src="foo.js"></script><script src="bar.js"></script><script src="bazz.js"></script>
16</head>
17<body>
18
19<!-- Google Analytics -->
20<script>
21 (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
22 (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
23 m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
24 })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
25
26 ga('create', 'UA-XXXXX-Y', 'auto');
27 ga('send', 'pageview');
28</script>
29<!-- End Google Analytics -->
30</body>
31</html>
上記のファイル test.html では、ひとつの <script>
要素が複数行にわたっていたり、逆に1行の中に複数の <script>
があったりしています。これを読み込んで、各 <script>
タグを出力するコマンドライン用のスクリプトを index.js として作りました。
$ node -v
v12.7.0
$ yarn -v
1.21.1
$ cat package.json
json
1{
2 "dependencies": {
3 "fs": "^0.0.1-security",
4 "jquery": "^3.4.1",
5 "jsdom": "^16.2.2"
6 },
7 "license": "UNLICENSED"
8}
$ cat index.js
javascript
1const [fs, { JSDOM }, jquery] = [require('fs'), require('jsdom'), require('jquery')];
2
3// JQuery オブジェクトからHTML文字列を得るための関数
4const htmlStr = jq => jq.clone().wrap('<div/>').parent().html();
5
6// ファイル test.html を読み込み、JQuery オブジェクト $ を作成
7const html = fs.readFileSync('test.html', 'utf-8'),
8 dom = new JSDOM(html),
9 $ = jquery(dom.window);
10
11// scriptタグを収集して、各々をHTML文字列にして表示
12$('script').each(function(i) {
13 console.log(`========== script tag #${i+1} ==========`)
14 console.log(htmlStr($(this)));
15})
16
$ yarn
yarn install v1.21.1
[1/4] ???? Resolving packages...
[2/4] ???? Fetching packages...
[3/4] ???? Linking dependencies...
[4/4] ???? Building fresh packages...
✨ Done in 0.81s.
$ node index.js
========== script tag #1 ==========
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorHvZcTNaix6yvo6HPPCzgETByMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
========== script tag #2 ==========
<script>
$(function() {
// something to do
});
</script>
========== script tag #3 ==========
<script src="foo.js"></script>
========== script tag #4 ==========
<script src="bar.js"></script>
========== script tag #5 ==========
<script src="bazz.js"></script>
========== script tag #6 ==========
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-XXXXX-Y', 'auto');
ga('send', 'pageview');
</script>
以上、参考になれば幸いです。
補足
(1) 上記の index.js の中で、<script>
の内容をHTML文字列にする関数htmlStr
は、以下から借りています。
(2) 上記の回答で挙げた index.js およびテスト用のHTML、 package.json を以下
に上げていますので、お手元で試す際にはcloneあるいはforkするなどして、ご利用ください。
補足2
正規表現でやることにしたとすると、(このような行が出現するのはごく希でしょうが)複数の <script>要素を含む(一行の)文字列、たとえば、上記のサンプルとして使った test.html に含まれる下記の行
<script src="foo.js"></script><script src="bar.js"></script><script src="bazz.js"></script>
から、3つの <script>要素を切り出せることが望ましいわけですが、そのような正規表現にはひと工夫が必要です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/06 02:46