正規表現で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さん
最大文字列にマッチしてしまうのでは?
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
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
この回答への補足
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
No.6
- 回答日時:
No5です。
なんか余計なものが付いてたので訂正。さらにちょっと追加。$url =~ m'((https?|ftp)://[^/\s?]*)';
$result = $&;
$result =~ s/:[0-9]+$//; # ポート番号も削りたければこの行も必要。
print $result;
この回答への補足
steel_grayさん、回答ありがとうございました。
余計なものが付くのはどんな場合なのでしょうか?
$url = "https://www.goo.ne.jp/test/test.cgi";の行を色々変えてみましたが余計なものは付かないのですが。
No.5
- 回答日時:
こんな方法でも。
(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
No.3
- 回答日時:
"
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
No.2
- 回答日時:
$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
No.1
- 回答日時:
^(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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlのエラーについてご教授く...
-
bashスクリプト
-
Strawberry Perl for Windows ...
-
perlで文字の置換又は抽出に関...
-
perlの構文でカンマの意味が分...
-
サクラエディターの設定の仕方...
-
perl このテキストファイルを簡...
-
Raspberry Pi
-
VB.net
-
テキストファイルで提出とは?
-
perl 正規表現でエラー
-
Perlで、「が」を、「...
-
プログラミングでポインタの勉...
-
perlで自動ログインをしたいが...
-
Perl言語について。
-
perlで2次元配列をサブルーチ...
-
画像が表示でnull; this.src
-
Perlで特定文字列から特定文字...
-
C言語の問題について
-
PerlでUTF-8のファイルの文字列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルで提出とは?
-
INDIRECT 横に再度抽出したい
-
perlをバージョンアップしたら...
-
openした後、closeしないでプロ...
-
アルファベットに付いて質問し...
-
Strawberry Perl for Windows ...
-
bashスクリプト
-
Perlのエラーについてご教授く...
-
Perlで特定文字列から特定文字...
-
画像が表示でnull; this.src
-
Wallpaper Engineでおすすめの...
-
Perl言語について。
-
perl LWPでURLにアクセスした時...
-
Perlで時間の計算
-
Perlで、「が」を、「...
-
ファイルアイコンの左下に緑の□...
-
Perl の外部モジュールの利用方法
-
このファイルを開く方法で困っ...
-
perlで2次元配列をサブルーチ...
-
Windows10においての『Perl』の...
おすすめ情報