• ベストアンサー

<script>...</script>内のコードの抽出方法

Ajaxで読み込んだHTML文書内にあるスクリプトのコードだけを 抽出したいのですが、正規表現を教えてください。 自分で考えてみたものは、以下の方法です。 これが最良なのかわかりません。 「スクリプトは複数箇所に存在しない」という条件で構いません。 宜しくお願いします。 var HTML = 'ここにHTML'; HTML.match(/.*<script.*>([\w\W]*)<\/script>.*/); scr = RegExp.$1; eval(scr);

質問者が選んだベストアンサー

  • ベストアンサー
  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.4

>改行が ああそうか・・・ mフラグ付けると どう? ダメなら [\s\S]* とか使う事になると思うけど・・・

noname#84373
質問者

お礼

mフラグの存在を知りませんでした。;_; scr = s.replace(/[\s|\S]*<script>|<\/script>[\s\S]*/gm,''); で、コードだけを抽出できました。 ありがとうございました。これですっきり。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.3

文字列的には <script[^>]*>(.*)<\/script> で取れる気がするけれど・・・・・

noname#84373
質問者

お礼

改行があると拾えないのです・・・

全文を見る
すると、全ての回答が全文表示されます。
  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.2

ごめん getElementsByTagName だね…(「s」抜け)

noname#84373
質問者

お礼

えへへっ!私なぞよくやります!

全文を見る
すると、全ての回答が全文表示されます。
  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

HTMLobj = document.createElement("sc"); HTMLobj.innerHTML = HTML; src = HTMLobj.getElementByTagName("script")[0].innerHTML; 検証してないけど こんなやり方じゃダメ?

noname#84373
質問者

お礼

試してみました!ばっちりでした!実質1行で済みます! (.innerTextだと取得できないんですね^^;) 一度書き込んだものから、拾い取るようで無駄なような気もしますが 最小のコードかも? でも正規表現も知りたいですね。 とにかく有難うございました。 sendRequest( function( oj ) { HTMLobj.innerHTML = oj.responseText; eval(HTMLobj.getElementsByTagName('script')[0].innerHTML); }, '', 'POST', '????.html',true,true );

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • マッチするのにRegExp.lastIndexがundefinedになってしまいます!

    下のようなJavascriptで、 正規表現でマッチして、その位置を調べたいと思います。 しかし・・・マッチはするものの、 肝心の位置(RegExp.lastIndex)が、undefinedになります・・・。 var str = "ABCDEFG"; var rex = new RegExp("C", "i"); if (str.match(rex)) { document.write(RegExp.lastIndex+"文字目にマッチ。"); } else { document.write("マッチしません。"); } どうしてなんでしょうか?? ちなみに、実際のスクリプトはもっと長いものですがそこでうまくいかないので・・・。 今回のソースは、適当なサンプルをとってきて、それを編集したものです。 そのサンプルでも動かないので・・・。ブラウザがおかしいんでしょうか? 一応、Firefox3とGoogleChromeで確認しましたが、やはりundefinedです・・・

  • 正規表現でURLを抽出するには。

    正規表現でURLを抽出するには。 HTML内リンク先などのURLを正規表現で抽出したいのですが。 HTML内で表記されているURLはhttpやhttps以外にも相対URLなど様々な書き方が できるようですが、それらを抽出する正規表現パターンはどの様に書けばよいのでしょうか?

    • ベストアンサー
    • Perl
  • vbaの正規表現で、マッチした一部分を抽出したい

    accessの正規表現で、マッチした部分の一部を取り出したいと思っています。 秀丸で言えば、 ------------------------ 文字列 あいうえお ↓↓↓ 正規表現 あ(.*)お 置き換え文字 \1 ↓↓↓ 抽出 いうえ ------------------------ って感じの「¥1」みたいなのがほしいと考えています。 現在、下記のような感じで、対象文字を抽出しています。 ここから、また正規表現でほしい部分を抽出しなければいけないのでしょうか? 【上の例で言えば、「あいうえお」を抽出する関数】 ------------------------ Function 抜き出し(ByVal 指定文字列 As String) As String Dim 正規表現, 一致集団, 一致要素 Set 正規表現 = CreateObject("VBScript.RegExp") 正規表現.Pattern = "購入日時[0-9]{4}年[0-9]{1,2}月[0-9]{1,2}日 [0-9]{1,2}時[0-9]{1,2}分" 正規表現.MultiLine = True Set 一致集団 = 正規表現.Execute(指定文字列) For Each 一致要素 In 一致集団 抜き出し = 一致要素.Value Exit For Next End Function ------------------------ これだと、 購入日時2012年1月25日 17時53分 がマッチします。 でもほしいのは、 2012年1月25日 17時53分 の部分だけ。 何かいい方法は無いでしょうか? よろしくお願いします。

  • 正規表現内に変数を使用する方法

    match() や replace() の第1引数に文字列ではなく正規表現を使用 できますがこの正規表現内に変数を使用する場合、どうやったらよいの でしょうか。 var str = 'てすと'; alert(str.replace(/str/, 'テスト')); とすることができません。 (Perlではパターン内に変数が使用できるのですがJSでは変数が使用 できません) http://ar.aichi-u.ac.jp/blog/js-replace.html に書いてあるように第1引数に文字列を渡すと正規表現ではなくただの 文字とのマッチになってしまうようなので(確認済み)使えません。 面倒ですがリンク先にあるようにnew RegExpでRegExpオブジェクトを 作ってやる方法しかないんでしょうか。

  • このコードは何をやっているのか

    data[i]には0~20位の数値が適当に入っている感じです function create(){ text += (data[i]+10).toString(31).toUpperCase(); while (text.match(/(\D)\1{8}/)) { text = text.replace(/(\D)\1{8}/,RegExp.$1+'9'); } while (text.match(/(\D)\1{7}/)) { text = text.replace(/(\D)\1{7}/,RegExp.$1+'8'); } while (text.match(/(\D)\1{6}/)) { text = text.replace(/(\D)\1{6}/,RegExp.$1+'7'); } while (text.match(/(\D)\1{5}/)) { text = text.replace(/(\D)\1{5}/,RegExp.$1+'6'); } while (text.match(/(\D)\1{4}/)) { text = text.replace(/(\D)\1{4}/,RegExp.$1+'5'); } while (text.match(/(\D)\1{3}/)) { text = text.replace(/(\D)\1{3}/,RegExp.$1+'4'); } while (text.match(/(\D)\1{2}/)) { text = text.replace(/(\D)\1{2}/,RegExp.$1+'3'); } while (text.match(/(\D)\1/)) { text = text.replace(/(\D)\1/,RegExp.$1+'2'); } } function load(text){ text = text.substring(text.indexOf("0")+1); while (text.match(/(\D)([2-9])/)) { text = text.replace(/(\D)([2-9])/,load2(RegExp.$1,RegExp.$2)) } j=1; for(i=0;i<text.length;i++) { cdata[j] = "ABCDEFGHIJKLMNOPQRSTU".indexOf(text.charAt(i)); j=j+1; } } function load2(arg1,arg2) { code = arg1; for (i=1;i<arg2;i++) { code += arg1; } return code; } 数値配列の圧縮とデコードをしているようですが 主に正規表現のあたりがどういう事をやっているのかが理解出来ません

  • ECMAScript:RegExp.exec()メソッドについて

    初めて投稿します。 var re = new RegExp("A", "g"); var res = "ABABAB".match(re); document.writeln(res); 上記のように、文字列に対してString.match()メソッドを使用して正規表現(gフラグつき)とマッチングを行うと結果は 「A,A,A」 とマッチしたAが全て配列として帰ってきますが、 var re = new RegExp("A", "g"); var res = re.exec("ABABAB"); document.writeln(res); 上記のように、文字列に対してregExp.exec()メソッドを使用して正規表現(gフラグつき)とマッチングを行うと結果は 「A」 とマッチしたAが1つしか帰ってきません。 ECMA 262 3rd Editionの仕様では、 (http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/) RegExp.exec()メソッドも、String.match()メソッドと同様に、regExpのオブジェクトを生成時に"g"フラグを付加して、ある文字列とマッチングすると、マッチするものが1件以上存在する場合、新しい配列にマッチしたもの全てを各要素に格納して値を返す動作を行うと(多分?)書かれているみたいなのですが、RegExp.exec()メソッドは、どのブラウザで操作を実行しようとしても、マッチした文字が1件しか帰ってきません。。。 教えていただきたいのは、 『何故、RegExp.exec()メソッドはマッチした文字が1件しか帰ってこないか?』です。 いろんなサイトを調べてみたのですが、どうしてRegExp.exec()メソッドがこのようなふるまいを起こすか断定できませんでした。。。 どなたか、JavaScriptやECMAScriptのロジカル的な部分で詳しい方がいらっしゃいましたら、 よろしくお願いいたします。m(__)m

  • Ajax.Updater で受けたHTML中のスクリプトを動かしたい

    Prototype.js の Ajax.Updater で受け取ったコンテンツの中で <script type="text/javascript"> .... の関数を動かしたいのですが、上手くいきません。 Ajax.Updater で受け取った下のようなHTMLをページに埋め込んで、クリックするとオブジェクトが見つかりませんと言われてしまいます。 <a href="javascript:void(intest('OK'))">テスト</a> <script type="text/javascript"> var args; function intest (args) { alert(args) } </script> どうしたら動くようになるんでしょうか?

  • この正規表現について教えてください。

    <script type="text/javascript"> ....................... ....................... ....................... </script> のようなHTML文書内のスクリプトを削除して <script type="text/javascript"> </script> のようにしたいのですが、どのような正規表現に なりますでしょうか。お願いします。

    • ベストアンサー
    • Perl
  • このコードを処理速度向上させることはできますか?

    このコードを処理速度向上させることはできますか? <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript"> //<![CDATA[ function className(str){ var alltag = document.getElementsByTagName("*"); var ary = []; for(var i=0;i<alltag.length;i++){ if("."+alltag[i].className == str){ ary.push(alltag[i]); } } return ary; } window.$ = function(str){ var ID = str.match(/^#(\w+)/), CLASS = str.match(/^\.(\w+)/), TAG = str.match(/^(\w+)|(\*)/), node = str.match(/^doc/)? document: TAG? document.getElementsByTagName(RegExp.$1==""?RegExp.$2:RegExp.$1): ID? document.getElementById(RegExp.$1): CLASS? navigator.appVersion.toLowerCase().indexOf("msie")? className(str): document.getElementsByClassName(RegExp.$1): null; this.style = function(css){ css = css.split(/\:|\;/); if(ID){ for(var j=0;j<css.length;j++) node.style[css[j].replace(/\s+/g,"").replace(/\-(\w)/,function($1){$1=$1.substr(1);return $1.toUpperCase()})] = css[j+1]; }else{ for(var i=0;i<node.length;i++){ for(var j=0;j<css.length;j++) node[i].style[css[j].replace(/\s+/g,"").replace(/\-(\w)/,function($1){$1=$1.substr(1);return $1.toUpperCase()})] = css[j+1]; } } } return this; } window.onload = function(){ var st = new Date().getTime(); for(var i=0;i<10000;i++){ $('#wrap').style("color:#00f; background:#f00; border-left:10px solid #000;"); $('div').style("border-right:10px solid #000; width:100px; height:100px; margin:10px;"); $('.cl').style("border-top:10px solid #000; background:#00f;"); } var end = new Date().getTime(); alert(end-st); } //]]> </script> <title></title> </head> <body> <div id="wrap">aaaaa</div> <div class="cl">bbb</div> <div class="cl">ccc</div> </body> </html> 他にも、もっとこうしたほうが…等ありましたら教えてください。どうか宜しくお願いします。

  • 正規表現について教えてください。

    正規表現について教えてください。以下は左に配置したサムネイル(X01s、X01as、X01bs・・・)をクリックすると右にそのサムネイルの拡大画像(X01l、X01al、X01bl・・・)を表示するページです。 サムネイルのimgタグを▼以下のようにしたいと考えています。 ※makethumbnail.cgiはサムネイル作成CGI 現在:<img src="X01s.jpg"> 変更後:<img src="/makethumbnail?src=X01s.jpg&w=100&h=&type="> ▼以下はダメでした。正規表現に問題があるのでしょうか。 <img src="/makethumbnail.cgi?src=' + img + 's' + ext + '&w=100&h=&type=" class="thumbnail" onclick="changeImage(this)"> お知恵をお借りできれば幸いです。 <head> <script type="text/javascript"> location.search.match(/^\?img=([^&]+)(\.[^&\.]+)&num=(.+)$/); var img = RegExp.$1; var ext = RegExp.$2; var num = Number(RegExp.$3); function changeImage(img){ var imgsrc = img.src || img; imgsrc.match(/^(.*)s(\.[^\.]+)$/); document.main.src = RegExp.$1 + "l" + RegExp.$2; return false; } document.write = img && ext && num ? document.write : function(){}; </script> </head> <body> <table> <tr> <th> <script type="text/javascript"> /* サムネイル */ document.write('<a href="#"><img src="' + img + 's' + ext + '" class="thumbnail" onclick="changeImage(this)"></a><br /><br />'); for (var i = 1; i < num; i++) { document.write('<a href="#"><img src="' + img + String.fromCharCode(0x60 + i) + 's' + ext + '" class="thumbnail" onclick="changeImage(this)"></a><br><br>'); } </script> </td> <td> <script type="text/javascript"> /* 拡大 */ document.write('<img src="' + img + 'l' + ext + '" name="main" id="main_image" />'); </script> </td> </tr></table>