この人頭いいなと思ったエピソード

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

A 回答 (9件)

$_=~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さん
最大文字列にマッチしてしまうのでは?
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/02/12 08:53

#8>2番目を取り出してるのですね。


3番目です。
[0]:http:
[1]:
[2]:www.goo.ne.jp
[3]:test
[4]:index.html
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/02/12 20:03

#3>http://だけ表示されてしまいます。


$addrを$url
に変えて下さい。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/02/12 12:11

> $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

この回答への補足

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

補足日時:2005/02/12 22:38
    • good
    • 0

No5です。

なんか余計なものが付いてたので訂正。さらにちょっと追加。

$url =~ m'((https?|ftp)://[^/\s?]*)';
$result = $&;
$result =~ s/:[0-9]+$//; # ポート番号も削りたければこの行も必要。
print $result;

この回答への補足

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

補足日時:2005/02/12 09:13
    • good
    • 0

こんな方法でも。

(Perl4ではNGだけど)

$url =~ m'((?:https?|ftp)://[^/\s\?]*)';
$result = $&;
print $result;

# やたら\エスケープが入るとわかりづらくなるので区切りを変えてみるのも手だと思う。

# No2,No4さんの後ろの $1 とか $1$2 は \1 とか \1\2 の間違いかな。

この回答への補足

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

補足日時:2005/02/12 09:04
    • good
    • 0

"

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

この回答への補足

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

補足日時:2005/02/12 08:58
    • good
    • 0

$url =~ s/^([a-z]+:\/\/[^\/\s$]+)[\/\s$]/$1/;



こんな感じかな。動作確認はしてませんが一応 空白文字・最後の/ 無し・ftpやhttps等にも対応したつもり…

この回答への補足

早速の回答ありがとうございます。
試してみましたが、どうもうまく出来ませんでした。
下記の記述で良いのでしょうか?
どこか間違っていればご指摘お願いします。

#!/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

補足日時:2005/02/11 02:40
    • good
    • 0

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

この回答への補足

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

補足日時:2005/02/12 08:55
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報