• ベストアンサー

URLエンコードの正規表現のoの効果

http://ash.jp/perl/tips_perl01.htm のサイトに # URLエンコード $arg =~ s/(\W)/'%'.unpack("H2", $1)/ego; と書かれていましたが、最後のoの効果が分かりません。 $argが何という文字であったなら、そのoが有る場合と 無い場合の違いが分かるのか、具体的な$argの値と一緒に 説明してください。

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.1

こんばんは、ninmurai さん。CGI の件ではなかったのですか。 何もそう慌てて閉めなくても(^^; でも、私もご質問の意味を少々つかみ損ねていたのは事実ですので、 再度ご説明いたします。 >$argが何という文字であったなら、そのoが有る場合と 無い場合の違いが分かるのか $arg には URL 文字列が入るのですね。 $arg = "oshiete1.goo.ne.jp/kotaeru.php3?q=642085"; としましょう。すると、 $arg =~ s/(\W)/'%'.unpack("H2", $1)/ego; においては unpack の働きで[0-9A-Za-z_]以外の文字、 つまり「.」→「%2e」、「/」→「%2f」、 「?」→「%3f」、「=」→「%3d」という置換が行われます。 その結果 $arg は「oshiete1%2egoo%2ene%2ejp%2fkotaeru%2ephp3%3fq%3d642085」 となります。 このうち、それぞれ URL 中に1度しか現れない「/」「?」「=」に対しては 「o」オプションの効果は出ないのですが、「.」は4回現れますので、 その4回の置換の際に「o」を用いることで変数の展開は1回だけで済む、 つまりいちいち「.」が「$1」に代入されることはなくなりその分速くなる、 とこういうことです。これでよろしいでしょうか?

ninmurai
質問者

お礼

ありがとうございました。

関連するQ&A

  • 正規表現のo

    http://ash.jp/perl/tips_perl01.htm のサイトに # URLエンコード $arg =~ s/(\W)/'%'.unpack("H2", $1)/ego; と書かれていましたが、最後のoの効果が分かりません。 $argが何という文字であったなら、そのoが有る場合と 無い場合の違いが分かるのか、具体的な$argの値と一緒に 説明してください。

    • 締切済み
    • CGI
  • AppleScript(or Perl)でURLエンコードするには?

    AppleScriptでURLエンコードするにはどのようにすれば良いのでしょう? Perlを使えばできそうなのですがうまくいきません。例えば”あ”をエンコードしようとして、do shell scriptコマンドから echo 'あ' | perl -pe '~s/([^?w ])/"%".unpack("H2", $1)/eg;' としても"%a4%a2"が正しいのですが、"%e3%81%82%0a"が返ってきます。 暗ーいトンネルに入ったような状態です。どなたかお力をお借りできないでしょうか?

  • PHPの正規表現について

    // URLエンコード $str =~ s/([^\w ])/'%' . unpack('H2', $1)/eg; $str =~ tr/ /+/; これをPHPの関数を使った方法と使わなかった方法が知りたいです。 また、正規表現で、ereg.., preg.., mb_eregがありますが、この違いの詳細が知りたいです。

    • ベストアンサー
    • PHP
  • URLデコードした文字列からURLエンコード

    よろしくおねがいします。 質問掲示板の中にある検索で質問掲示板の中身を検索した時に、同時にGoogleでも検索しようとおもっています 初めにフォームから得られたクエリーをデコードして &jcode'convert(*val, 'sjis'); に変換しました。 これで得た文字列で質問掲示板の中身を検索します。 つぎに、この文字列をエンコードしてGoogleに渡そうと思いましたが、ここでつまずいてしまいました。 &jcode'convert(*sarchword,'euc','sjis'); #---------- $sarchword =~ s/([^\w ])/'%' . unpack('H2', $1)/eg; $sarchword =~ s/(\W)/'%'.unpack("H2", $1)/ego; #---------- #↑このどちらかを行ってから $sarchword =~ tr/ /+/; これでできると検索して出てきたのですが、それでも正しい結果を得ることができず、文字コードの変換も'euc'を'sjis'等といろいろ変換してみてもできずに困っています。エンコードした結果の文字コードがまったく別のコードになってしまうみたいなのです。 たとえば「あいうえお」と検索したときに、上の方法でエンコードすると「%a4%a2%a4%a4%a4%a6%a4%a8%a4%aa」という値になります。 正しい結果を得る方法を教えていただけないでしょうか。 意味がわかりませんでしたら、再度説明いたしますのでよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • [Perl] unpackで不要文字にエンコード

    Perl CGIについてです。 文字列をエンコードしようと次のようにしてみました。 $val1 =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $val2 =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $va1は問題なくエンコードされ、デコードも元文字に戻ったのですが、 $va2のエンコード文字に不要な'25'が含まれるようになってしまいました。 例:「ガム」をエンコード >> %A5%AC%A5%E0  を期待していたのですが、結果は %25A5%25AC%25A5%25E0 と不要に'25'が含まれてしまいました。unpackの文が悪いのでしょうか?ご教示ください。

    • ベストアンサー
    • CGI
  • 正規表現の o オプションの意味が分かりません

    正規表現の質問です。 言語はPerlで組んでいます。 いくつかのhtmlファイルを順に開き、以下のようなコードを実行します。 $http{BODY}=~ /(?<=\[ No\.)([0-9]{$digit})(?= \/ $num)/o; ここで $http{BODY} 読み込んだhtmlファイル $digit 変数。整数値。 $num 変数。整数値。 この正規表現で、 ・・・・[ No.2 / 3 ]・・・・ といった感じの文字列から、この場合は「2」をマッチさせようとしました。 ところが最初に読み込んだファイルではうまくマッチしたのですが、2番目のファイルではマッチしません。 o オプションを外すとうまくいきました。o オプションは変数展開を1回行うとのことです。元のファイルはやたらとでかいので、o オプションを付けたら少しは早くなるかなと思いつけていたのですが。。。 ネットで調べると、 while( $s = <FH> ){ # 一度だけ展開する if ( $s =~ /$arg/o; ){ .... } このような用例で、$argは変数というよりも、セットされた文字列として評価されるとあります。でも前述の正規表現の2つの変数、$digitと$numは普通に値を書き換えられていましたけど。。。 それとも o オプションを付けた正規表現では、その正規表現を処理するためのメモリ領域に一度変数の値を取り込むと、二度と読み込むことをしないということでしょうか。だから変数の値が変わっても、正規表現が用いるメモリ領域の値は変化しない。。。 でも $http{BODY}=~ /(?<=\[ No\.)([0-9]{$digit})/o; だったらちゃんと$digitの値が変わったことに対応しているんです。他にもいっぱい o オプションを付けた正規表現を用いていますけど、全部正常に作動しています(バグに気づいていないだけかもしれませんけど)。 前述の正規表現とこれら正常に作動する正規表現の違いは、後者が変数1個であるのに対して、前者は2個であるということです。「変数展開を1回行う」の意味は、変数1個にしか対応しないという意味なのでしょうか。でも前者も最初のファイルだけなら2個の変数に対応しているのです。 どういうことなのでしょう。

    • ベストアンサー
    • Perl
  • 一般的な方法で『URLエンコード』ができません・・・

    よろしくお願いいたします。 テキストボックスに入力(「こんにちは」など)した値をもとに、Yahooで検索させたいのですが、以下の方法でエンコードしました。 sub url_encode($) { my $str = shift; $str =~ s/([^\w ])/'%'.unpack('H2', $1)/eg; $str =~ tr/ /+/; return $str; } そうしたところ、「/」や「:」も別の文字「%2f」「%3a」に変換されてしまい、Yahooのページが開きません。 ちなみにYahooで「こんにちは」と検索すると、URLが以下のようになります。 http://search.yahoo.co.jp/search?p=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF&ei=UTF-8&fr=top_v2&x=wrt&meta=vc%3D テキストボックスに「こんにちは」と入力すして検索ボタンをクリックすると、上記のように変換させたいのです。 どのようにしてエンコードしたらよろしいのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ApacheのURLエンコード

    URLエンコードで悩んでおります。 LinuxのApache1.3系では URLエンコードはGETで正しく処理できますが、 WindwosのApache2.0系では正しい値が取得できません。 ちなみにPOSTは漢字でも両方処理できました。 URLエンコードでApacheの設定で注意しないといけない点がありましたら 教えて下さい。 はてな ではLinuxのようです。 Apache/1.3.27 (Unix) (Vine/Linux) mod_perl/1.29 http://d.hatena.ne.jp/keyword/%c5%d4%b1%c4%c2%e7%b9%be%b8%cd%c0%fe?kid=930

  • utf-8の文字列に対してURLエンコードを行なうには?

    最近 perlをutf-8で書き始めたのですが、文字コードではまっています。 cgiの内部から別のcgiへpostで全角文字を送る場合 URLエンコードしてから送ると思うのですが 文字コードがutf-8の時、どのようにURLエンコードしたら 良いのか分からず困っています。どなたかご存知でしょうか? ちなみに文字を受ける方のcgiでは以下の様にURLデコードしています。 $data =~ tr/+/ /; $data =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; 試用しているperlのバージョンはperl5.8です、よろしくお願いします。

    • ベストアンサー
    • Perl
  • エンコードについて

    「タイトル」というテキストを 下記のコードでエンコードすると、 # 検索用エンコード $encode = $code; $encode =~ s/(\W)/'%' . unpack("H2", $1)/eg; $encode =~ tr/ /+/; %83%5e%83C%83g%83%8b となりますが、 %E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB のようにしたいのです。 上記の検索用エンコードをどのように書き換えればできるでしょうか。 似たような記事もありましたが、明確な答えがありませんでした。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Perl