読者です 読者をやめる 読者になる 読者になる

たぷつきません

おなかがでてきた。もうたぷついてるやん。

正規表現で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">);
  

になって無事解決。