正規表現でHTMLの</script>までの中身を得たいだけでハマった
HTMLパーサーを主に正規表現だけで実装しようとしてるんだけど、scriptタグ内ではjsコード内でHTMLの要素が含まれちゃう場合があるのでスキップして "</script" が見つかるまでをテキストノードとして取得しようとしたら、これが意外にうまくいかない。
document.write(document.write('<link rel="stylesheet" type="text/css" href="' + CSS_PATH + '/' + new gadgets.Prefs().getString("theme") + '-theme/jquery-ui-1.10.4.custom.min.css">); </script> <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> </head>....
に対して、最初にやったのは
"([\s\S]*)</script"
これ。
すると取れたのは
document.write(document.write('<link rel="stylesheet" type="text/css" href="' + CSS_PATH + '/' + new gadgets.Prefs().getString("theme") + '-theme/jquery-ui-1.10.4.custom.min.css">); </script> <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script
これ。直近のまでじゃ無く最後に見つかった</ script までになっちゃう!
んで結局なにかってゆーと、+や*ってのはその条件が続く最も長い結果を持つってことだった。
最長一致ってやつ。
最短一致にするには、*の後ろに?を付けるだけでいけるとのこと。
"([\s\S]*?)</script"
ってやるだけ。
そしたら
document.write(document.write('<link rel="stylesheet" type="text/css" href="' + CSS_PATH + '/' + new gadgets.Prefs().getString("theme") + '-theme/jquery-ui-1.10.4.custom.min.css">); </script
これが取れて、その結果のgroup(1)を取れば
document.write(document.write('<link rel="stylesheet" type="text/css" href="' + CSS_PATH + '/' + new gadgets.Prefs().getString("theme") + '-theme/jquery-ui-1.10.4.custom.min.css">);
になって無事解決。