正規表現で(.*?)&とは?

このQ&Aのポイント
  • JavaScriptの正規表現で使用される(.*?)&の部分の意味について理解できません。
  • 正規表現の.*は任意の長さの任意の文字を表し、?は直前の文字が0か1回出現することを表します。
  • 括弧に入るのは一般的なURLで、?があるとwwwなどはmatchしないようです。また、&は特定の文字と一致することを表します。
回答を見る
  • ベストアンサー

正規表現で「(.*?)&」とは?

あるjavascriptプログラムでaタグのhrefをmatchさせるのに、 a=document.getElementsByTagName; for(i=0;i<a.length;i++){ if (a[i].href.match(/hogehoge\?url=(.*?)&/)){ ... } } のように書かれていたのですが、matchの中の(.*?)&の部分が少し理解できません。まず、.*でほとんど全ての文字を任意の長さでmatchさせるのは分かるのですが、そのあとの?と括弧のあとの&の意味が分かりません。 括弧に入るのは一般的なURLなのですが、?があると、たとえばwwwなどはmatchしないように思うのですが、違うのでしょうか。また、そのあとの&はどういった意味なのか分かりません。 以上の二点について分かる方教えてください。

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

  • ベストアンサー
回答No.1

. 任意のキャラクタ * 前の一致の0個以上の一致 ? 最短一致指定 -----------ここまで正規表現の特殊記号------------- \? urlのGETパラメタ指定(?をキャラクタ指定するにはエスケープする必要があるため\が付いている) & urlのGETパラメタのセパレタ -----------ここまでURLの特殊記号------------- つまり、 [hogehoge?url=keyword&aaaa=bbbbb&cccccc=dddddd] というurlから keyword を引っ張り出す正規表現です。 最短一致(?)がない場合は keyword&aaaa=bbbbb がヒットします。 &がない場合は keyword&aaaa=bbbbb&cccccc=dddddd までヒットします [hogehoge?url=keyword] にはヒットしません(末尾の&が無い) 以上

twinhourse
質問者

お礼

なるほど、そういうことだったんですか。 最短一致が、思っていた意味とは違っていたので非常に参考になりました。また、&も何か特殊記号なのかと思っていましたが、やはり違うのですね。 ありがとうございました。

関連するQ&A

  • 戻り読みの代わりとなる正規表現について

    正規表現を使いたいのですが、 javascriptでは戻り読み表現が使えないと知って困っています・・・ <a href="http://abc.com/"><img src="http://image.abc.com/def.jpg"></a> <a href="http://hogehoge.com/"><img src="http://hogehoge.com/hoge.jpg"></a> <a href="http://123.com/"><img src="http://456.com/789.jpg"></a> <a href="http://momomo.com/"><img src="http://lelele.com/momo.jpg"></a> 上記のソースから http://image.abc.com/def.jpg http://hogehoge.com/hoge.jpg http://456.com/789.jpg http://lelele.com/momo.jpg だけをマッチさせたいです。 (画像のパスだけをマッチさせたい) URLは今後も増える可能性があり、サイト名、文字数、画像名などもバラバラです。 うまくマッチさせる方法はありますでしょうか。 詳しい方いらっしゃいましたらよろしくお願いします!

  • HTMLのソースの取得・正規表現

    プログラム自体始めて間もない初心者です。 javascriptでHTMLのソースを取得して、正規表現でマッチしたURLを書き出したいと思います。 取得したソースから正規表現で抽出はできましたが、さらに手を加えると機能しませんでした。 下記test-1では「http://abc.com/」と表示されましたので思った通りに動きました。 しかし、test-2では「http」と表示されると思っていたところ、表示されませんでした。 この違いはなんでしょうか? //////////////////// test-1 <html> <head> <script type="text/javascript"> function test(){ aaa = document.getElementsByTagName("html")[0].innerHTML; bbb = aaa.match(/http:\/\/abc\.com\//); document.write(bbb); } </script> </head> <body> <input type="button" onclick="test()"> <a href="http://abc.com/"> </body> </html> //////////////////// test-2 function test(){ aaa = document.getElementsByTagName("html")[0].innerHTML; bbb = aaa.match(/http:\/\/abc\.com\//); ccc = bbb.match(/http/); document.write(ccc); }

  • 正規表現(~を含まないものにマッチ)

    Perlの正規表現について質問です。 画像<img src="http://hogehoge.com/img/gokuu.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/pikkoro.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/bejiita.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/gohan.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/buruma.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> ↓ 処理後 ↓ 画像<img src="gazo_new1.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazo_new2.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazo_new3.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazo_new4.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazo_new5.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> (変更した画像:gokuu.jpg,pikkoro.jpg,bejiita.jpg,gohan.jpg,buruma.jpg,) 以上のように 画像URL部分のみを gazo_new(連番).jpg に変更させ、 変更前の画像URL一覧を表示させるスクリプトを書いてみました。 $htmldata にHTMLの全データが格納されているとします。 $i=1; while($htmldata=~/(<\s*img.*?src.*?=["\s]*)([.\/]*?\/)?((?:(?!gazo_new)[^"\s>])*)?["\s]?.*?>/i){ $imgurlparts .="$3,"; $htmldata=~ s/(<\s*img.*?src.*?=["\s]*)((?:(?!gazo_new)[^"\s>])*)?(["\s]?.*?>)/$1gazo_new$i.jpg$3/i; $i++; } $htmldata .="(変更した画像:$imgurlparts)"; どうにもうまく動きません。 何卒ご教示をお願い致します。

    • ベストアンサー
    • Perl
  • 正規表現の否定先読みについて

    <a href="http://example.com/aaaa/hogehoge1.jpg" target="_blank"><img src="http://example.com/aaaa/hogehoge1.jpg" width="100" alt="huge1"></a><br />hogehoge<br /><a href="http://example.com/bbbb/hogehoge2.jpg" target="_blank"> <img src="http://example.com/bbbb/hogehoge2.jpg" alt="huge2"></a> こういうHTMLがあるとします。改行はなく1行です。 このHTMLから正規表現で 『width="100"がついていない<img>タグ』 のsrc=""までを抜き出して置換したいのです。 期待する結果は <img src="http://example.com/hage/hogehoge2.jpg" です。 そこで /<img src="http:\/\/.*?.jpg"\s(?!width)/ というパターンを試しましたが、.*?の最短一致が思った通りにいかず <img src="http://example.com/aaaa/hogehoge1.jpg" width="100" alt="huge1"></a><br />hogehoge<br /><a href="http://example.com/bbbb/hogehoge2.jpg" と、1つ目の<img>が入ってしまい、2つ目の<a>タグまで抜き出されてしまいます。 これをうまくwidth="\d+"と入っていない<img>タグのみに適用させる方法はないでしょうか? どなたかよろしくおねがいいたします。

    • ベストアンサー
    • PHP
  • これをOperaでも動くようにしたい

    http://programming-magic.com/?id=158 こちらの function(){ var l = document.getElementsByTagName("A"); for(var i=0; i<l.length; i++){ var a = l[i]; if(a.href.indexOf('javascript:',0)){ var e = /*@cc_on!@*/0; if(e){//IE専用 a.href = 'javascript: (function(){location.href = "'+a.href+'";})();'; } else{//Firefox、Opera、Safari a.href = 'data:text/html;charset=utf-8,'+encodeURIComponent('<script type="text/javascript"><!--\ndocument.write(\'<meta http-equiv="refresh" content="0;url='+a.href+'">\');// --><'+'/script>'); } } } } を、Operaでも動くようにできませんでしょうか

  • PHP requireの後にJS実行

    PHPで外部サイトからニュースを切り出して表示させているのですが ニュースを切り出した箇所にURLを改変するJavaScriptを組み込んでいます。 静的ページでJavaScriptを稼働させると正常に動作して指定箇所のURLを書き換えます。 しかしPHPで外部から読み込ませると正常に動作してくれません。 外部から動的ロードされたデータに対してJavaScriptを動作させるにはどうしたら良いでしょうか? body onload は試しましたが駄目でした。 何方かお力添えをお願い致します。 【現在のソース】 ※動的に読み込んだニュースデータの相対参照URLに指定ドメインを付与したいです。 <!-- 動的ロード箇所 --> <ul id="news"> <a href="/news/0123456789.html"></a> </ul> <!-- ここからURL書き換えscripts--> <script type="text/javascript"> kitou(); function kitou() { var a = document.getElementById('news').getElementsByTagName('a'); var i = 0; var output; for( i = 0; i < a.length; i++ ) { a[i].href = a[i].href.replace( document.domain, 'www.google.co.jp' ); } } </script>

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

    正規表現について教えてください。以下は左に配置したサムネイル(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>

  • 正規表現、htmlからリンクの相対パスのみ抜き出したい

    タイトルの通りhtmlから正規表現で 相対パスのリンクだけ抜き出したいです。 現在は「a href="([^/][^\"]+)」のようにやっています でもこれだと a href="http://xxx.xxx---" a href="mailto:---" a href="javascript:---" のような拾いたくないケースにもマッチしてしまいます。 途中に「:」が入るのをマッチさせなければいいんでしょうけど、 うまい表現が思いつきません。 このような条件でマッチさせる正規表現は どのようにすればいいでしょうか? よろしくお願いします。

  • 正規表現 matchメソッド

    Ruby認定試験対策問題の解説の中で、分からない箇所があったので、教えてください。 ■問題9の一部 s = "I slit the sheet, the sheet I slit, and on the slitted sheet I sit." /sheet/.match(s).length ■説明 文字列sの中と正規表現/sheet/にマッチした全体の文字列とマッチした部分文字列の配列の数を取得します。 ■回答 => 1 ■irbで自分なりに試してみた内容 irb> s = "I slit the sheet, the sheet I slit, and on the slitted sheet I sit." => "I slit the sheet, the sheet I slit, and on the slitted sheet I sit." irb> /sheet/.match(s).length => 1 irb> /sheet/.match(s) => #<MatchData:0x2c28d30> irb> /sheet/.match(s).class => MatchData irb> /sheet/.match(s).to_a => ["sheet"] irb> /sheet/.match(s).offset(0) => [11, 16] ■疑問 ・match(s).lengthの答えが、どうして1になるか分からない。 ・説明の中の「正規表現/sheet/にマッチした全体の文字列」とは何を指すのか? ・説明の中の「マッチした部分文字列の配列」が何を意味しているか? ・返ってきたMatchData オブジェクトの中身は何?  [11, 16]だけってこと? 一応、リファレンスも覗いてみたのですが、そこに掲載されていた内容もよく理解できませんでした。 http://www.ruby-lang.org/ja/man/html/Regexp.html#match bar = /foo(.*)baz/.match("foobarbaz").to_a[1] foo, bar, baz = /(foo)(bar)(baz)/.match("foobarbaz").to_a.values_at(1,2,3) さらに、そこに掲載されていた「正規表現にマッチした部分文字列だけが必要な場合に」 ってのは、どういう意味なのでしょうか。

    • ベストアンサー
    • Ruby
  • リンク先のアドレス内に「?」が入っている場合の対処法

    先日、元々のリンク先から1行テキスト領域にID等を入力し各々異なる場所に飛ばす方法を教えていただきました。 そして解決したのですが、そのアドレスに「?」が入っている場合、反応しないようです・・・。 解決方法はあるのでしょうか?どなたかご教授お願いします。下記が現在組んでいるものです。 ●通常のアドレスの場合(「?」無し) ※これは成功します <script> function change(){ var change=document.getElementById("change"); var tags=document.getElementsByTagName("a"); for(var i=0;i<tags.length;i++){ var url="http://aaa.bbb.ccc/" if(tags[i].href.match(url)){ tags[i].href=url+change.value; }; } } </script> <a href="http://aaa.bbb.ccc/" target="_blank"> <img src="http://aaa.bbb.ccc/image/d.gif"></a> <input type="text" id="change"> <input type="button" value="変換" onClick="change()"> ●「?」がアドレス内にある場合 ※これは反応しません <script> function change(){ var change=document.getElementById("change"); var tags=document.getElementsByTagName("a"); for(var i=0;i<tags.length;i++){ var url="http://aaa.bbb?.ccc/" if(tags[i].href.match(url)){ tags[i].href=url+change.value; }; } } </script> <a href="http://aaa.bbb?.ccc/" target="_blank"> <img src="http://aaa.bbb.ccc/image/d.gif"></a> <input type="text" id="change"> <input type="button" value="変換" onClick="change()"> 宜しくお願いします。

専門家に質問してみよう