• ベストアンサー

正規表現(/以下切り取り)

正規表現でURLのサブドメインを抜き取りたいのですが ご教授お願いします。 http://www.goo.ne.jp/test/index.html          ↓ http://www.goo.ne.jp

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

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

$_=~s/^([a-zA-Z]+:\/\/)(.*?)[\/\?\s].*/$1$2/; で良いと思います。 http://aaaa.bbb.ccc http://aaaa.bbb.ccc/ http://aaaa.bbb.ccc/aaa/bbbb/cc http://aaaa.bbb.ccc/aaa/bbbb/cc/ http://aaaa.bbb.ccc?aaa=xx ftp://aaaa.bbb.ccc/aaaa.zip などに対応できるハズです。 蛇足ですが.. >#2さん 最大文字列にマッチしてしまうのでは?

meikenpochi
質問者

お礼

k_o_r_o_c_h_a_nさん、回答ありがとうございました。 凄いです出来ました。 #!/usr/bin/perl print "Content-type: text/html\n\n"; print<<"end"; <HTML><BODY> end $url = "https://www.goo.ne.jp/test/test.cgi"; $url =~s/^([a-zA-Z]+:\/\/)(.*?)[\/\?\s].*/$1$2/; print $url; print<<"end"; </BODY></HTML> end

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

その他の回答 (8)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.9

#8>2番目を取り出してるのですね。 3番目です。 [0]:http: [1]: [2]:www.goo.ne.jp [3]:test [4]:index.html

meikenpochi
質問者

お礼

BLUEPIXYさん、 分かりやすい回答ありがとうございます。 3番目ですね。

すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.8

#3>http://だけ表示されてしまいます。 $addrを$url に変えて下さい。

meikenpochi
質問者

お礼

BLUEPIXYさん、回答ありがとうございます。 /で分割して2番目を取り出してるのですね。 こういうやり方もあるのですね。 大変参考になりました、ありがとうございます。

すると、全ての回答が全文表示されます。
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.7

> $result = $&;の行はどんな処理をさせているのでしょうか? マッチングを行った結果が$&という変数に入る事になっていますので、その結果を取り出しています。 ()でくくって後で$1,$2などで取り出す場合がありますが、それと同様のものです。 全体を()でくくって$1で参照するのと同じ。 →参照URL >余計なものが付くのはどんな場合なのでしょうか? 説明不足でした。処理結果に余計なものがつくのではなく、(No5の)回答のソースコードに無駄があったという意味でした。

参考URL:
http://www.rfs.jp/sitebuilder/perl/02/09.html#%83}%83b%83%60%95%CF%90%94%82%CC%88%EA%97%97
meikenpochi
質問者

補足

steel_grayさん、回答ありがとうございます。 >(No5の)回答のソースコードに無駄があった そうですか、正規表現って奥が深いですね。 まだ良く理解出来ていないので無駄が多いかもしれませんが、回答して下さった皆さんのおかげで、やりたい事が実現できました。 ありがとうございます。 やりたかったことはディレクトリー型検索サイトで登録URLに制限を設けたかったのです。 以下の様な感じです。 #!/usr/bin/perl print "Content-type: text/html\n\n"; print<<"end"; <HTML><BODY> end #URLとバナーのサブドメインが異なる場合は登録排除) $url = "http://www.goo.ne.jp/~pochi/index.html"; $bn = "http://www.goo.ne.jp/~pochi/banner.jpg"; print "URL---$url<br>\n"; print "Banner---$bn<br>\n"; $url =~s/^(\S+:\/\/)(.*?)(\/.*)/$1$2/; $bn =~s/^(\S+:\/\/)(.*?)(\/.*)/$1$2/; print "URLサブドメイン---$url<br>\n"; print "Bannurサブドメイン---$bn<br>\n"; if($url eq $bn){print "URLとバナーのサブドメインは一致しています。\n";} if($url ne $bn){print "URLとバナーのサブドメインが一致していません。\n";} #2重登録チェック(同一ディレクトリ下のファイルは登録排除) $tourokuzumi_url = "http://www.goo.ne.jp/test/index.html"; $sinsei_url = "http://www.goo.ne.jp/test/index2.html"; print "<br><br>登録済みURL---$tourokuzumi_url<br>\n"; print "登録申\請URL---$sinsei_url<br>\n"; $tourokuzumi_url =~s/^(\S+)(.*?)(\/.*)/$1$2/; $sinsei_url =~s/^(\S+)(.*?)(\/.*)/$1$2/; print "登録済みURL---$tourokuzumi_url<br>\n"; print "登録申\請URL---$sinsei_url<br>\n"; if($tourokuzumi_url eq $sinsei_url){print "そのURLは登録済みです。\n";} if($tourokuzumi_url ne $sinsei_url){print "そのURLは未登録です。\n";} #使用禁止文字チェック $ID_url1 = "http://www.goo.ne.jp/ad.php?ad_code=user1"; $ID_url2 = "http://www.goo.ne.jp/ad.php?ad_code=user1"; print "<br><br>URL---$ID_url1<br>\n"; if($ID_url1 =~ /[\&\?=]|(click)/ ){print "URLに\"$&\"は使用できません。\n";} if($ID_url2 !~ /[\&\?=]|(click)/ ){print "URLには不正文字は含まれていません。\n";} print<<"end"; </BODY></HTML> end

すると、全ての回答が全文表示されます。
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.6

No5です。なんか余計なものが付いてたので訂正。さらにちょっと追加。 $url =~ m'((https?|ftp)://[^/\s?]*)'; $result = $&; $result =~ s/:[0-9]+$//; # ポート番号も削りたければこの行も必要。 print $result;

meikenpochi
質問者

補足

steel_grayさん、回答ありがとうございました。 余計なものが付くのはどんな場合なのでしょうか? $url = "https://www.goo.ne.jp/test/test.cgi";の行を色々変えてみましたが余計なものは付かないのですが。

すると、全ての回答が全文表示されます。
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.5

こんな方法でも。(Perl4ではNGだけど) $url =~ m'((?:https?|ftp)://[^/\s\?]*)'; $result = $&; print $result; # やたら\エスケープが入るとわかりづらくなるので区切りを変えてみるのも手だと思う。 # No2,No4さんの後ろの $1 とか $1$2 は \1 とか \1\2 の間違いかな。

meikenpochi
質問者

補足

steel_grayさん、回答ありがとうございました。 出来ました。ところで $result = $&;の行はどんな処理をさせているのでしょうか? #!/usr/bin/perl print "Content-type: text/html\n\n"; print<<"end"; <HTML><BODY> end $url = "https://www.goo.ne.jp/test/test.cgi"; $url =~ m'((?:https?|ftp)://[^/\s\?]*)'; $result = $&; print $result; print<<"end"; </BODY></HTML> end

すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

"http://".(split /\//,$addr)[2]

meikenpochi
質問者

補足

BLUEPIXYさん、ありがとうございました。 試してみましたが、http://だけ表示されてしまいます。 #!/usr/bin/perl print "Content-type: text/html\n\n"; print<<"end"; <HTML><BODY> end $url = "https://www.goo.ne.jp/test/test.cgi"; $url ="http://".(split /\//,$addr)[2]; print $url; print<<"end"; </BODY></HTML> end

すると、全ての回答が全文表示されます。
  • sion_fs
  • ベストアンサー率36% (152/416)
回答No.2

$url =~ s/^([a-z]+:\/\/[^\/\s$]+)[\/\s$]/$1/; こんな感じかな。動作確認はしてませんが一応 空白文字・最後の/ 無し・ftpやhttps等にも対応したつもり…

meikenpochi
質問者

補足

早速の回答ありがとうございます。 試してみましたが、どうもうまく出来ませんでした。 下記の記述で良いのでしょうか? どこか間違っていればご指摘お願いします。 #!/usr/bin/perl print "Content-type: text/html\n\n"; print<<"end"; <HTML><BODY> end $url = "http://www.goo.ne.jp/test/test.cgi"; $url =~ s/^([a-z]+:\/\/[^\/\s$]+)[\/\s$]/$1/; print "$url\n"; print<<"end"; </BODY></HTML> end

すると、全ての回答が全文表示されます。
  • osumitan
  • ベストアンサー率33% (102/307)
回答No.1

^(http:\/\/[^\/]*)\//\1

meikenpochi
質問者

補足

osumitanさん、回答ありがとうございました。 試してみましたが、残念ながらエラーが出て表示出来ませんでした。 #!/usr/bin/perl print "Content-type: text/html\n\n"; print<<"end"; <HTML><BODY> end $url = "https://www.goo.ne.jp/test/test.cgi"; $url =^(http:\/\/[^\/]*)\//\1; print $url; print<<"end"; </BODY></HTML> end

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

関連するQ&A