電子書籍の厳選無料作品が豊富!

perlでホームページのURLが正しいか判定したいのですが、ネットで調べていても出てくるのがメールアドレスの判定方法ばかりで、ホームページに関してのことがなかなか見つかりません。

if($url !~ /^https?:\/\/[\w\.-~\?&=\/]{4,}/) { }

こんな感じで適当にやっていたのですが、なぜか ,(カンマ) のチェックをスルーしてしまったりと思うように制御できておらず、
http://www.din.or.jp/~ohzaki/perl.htm#httpURL
このページを読んでもちんぷんかんぷんで、とりあえず

if($url !~ /\b(?:https?|shttp)://(?:(?:[-_.!~*'()a-zA-Z0-9;:&=+$,]|%[0-9A-Fa-f
][0-9A-Fa-f])*@)?(?:(?:[a-zA-Z0-9](?:[-a-zA-Z0-9]*[a-zA-Z0-9])?\.)
*[a-zA-Z](?:[-a-zA-Z0-9]*[a-zA-Z0-9])?\.?|[0-9]+\.[0-9]+\.[0-9]+\.
[0-9]+)(?::[0-9]*)?(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f]
[0-9A-Fa-f])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-
Fa-f])*)*(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f
])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*)*)
*)?(?:\?(?:[-_.!~*'()a-zA-Z0-9;/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])
*)?(?:#(?:[-_.!~*'()a-zA-Z0-9;/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*
)?/){ }

こんな感じで代入してみても予想どおり構文エラーとなってしまい、どうやればいいのか困っています。(あまりの長さに理解できていないためエスケープも一切させてないので、エラーが出て当然といえば当然ですが)



そこまで厳密にでなくてもかまわないのですが、ホームページのURLに間違いがないかチェックする方法はないでしょうか。
(特に . と , や : と ; や ~ と ^ の入力間違い、スペースが入っていないかとか全角入力になっていないかなどをチェックしたいです)

A 回答 (2件)

>internal server errorになってしまいます。


中味を見ていないので、何とも言えないです。

>やはりあの難しいけど正しいチェック方法は簡単には利用できないのですかね?
利用はできますよ。#後で記載

>,(カンマ) のチェックをスルー
と記載されていますが、参照ページの正規表現では,(カンマ)は含まれています。
実際にそういうページは存在しますし。

そのまま使えばいいだけだと思いますが、
まあ、とりあえず、以下でお試しを。

$http_URL_regex =
q{^\b(?:https?|shttp)://(?:(?:[-_.!~*'()a-zA-Z0-9;:&=+$,]|%[0-9A-Fa-f} .
q{][0-9A-Fa-f])*@)?(?:(?:[a-zA-Z0-9](?:[-a-zA-Z0-9]*[a-zA-Z0-9])?\.)} .
q{*[a-zA-Z](?:[-a-zA-Z0-9]*[a-zA-Z0-9])?\.?|[0-9]+\.[0-9]+\.[0-9]+\.} .
q{[0-9]+)(?::[0-9]*)?(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f]} .
q{[0-9A-Fa-f])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-} .
q{Fa-f])*)*(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f} .
q{])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*)*)} .
q{*)?(?:\?(?:[-_.!~*'()a-zA-Z0-9;/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])} .
q{*)?(?:#(?:[-_.!~*'()a-zA-Z0-9;/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*} .
q{)?$};
# 正常なリンク
$url = "http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F% …
print "Test1<br>";
if($url =~ /$http_URL_regex/) {print "match";}
else{print "no match";}

# 「あ」を入れてみた。
$url = "http://ja.wikipedia.org/wiki/%E6%AD%A3あ%E8%A6%8F%E8%A1%A8%E7%8F%BE";
print "<br>";
print "Test2<br>";
if($url =~ /$http_URL_regex/) {print "match";}
else{print "no match";}

# ホストなし
$url = "http://%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE";
print "<br>";
print "Test3<br>";
if($url =~ /$http_URL_regex/) {print "match";}
else{print "no match";}

# ポート付き
$url = "http://okwave.jp:80";
print "<br>";
print "Test4<br>";
if($url =~ /$http_URL_regex/) {print "match";}
else{print "no match";}

# へんなところにポート付き
$url = "http://okwa:80ve.jp";
print "<br>";
print "Test5<br>";
if($url =~ /$http_URL_regex/) {print "match";}
else{print "no match";}

ただ、正規表現が複雑になれば複雑になるほど、
サーバー負担も大きくなるということです。

当初の質問文には厳密にでなくてもかまわないとあったんですけどね・・・。
    • good
    • 0
この回答へのお礼

大変詳しい解説ありがとうございました。
何とかうまくまとまりました。

>当初の質問文には厳密にでなくてもかまわないとあったんですけどね・・・。

確かに厳密でなくても良かったのですが、入力間違いに気づかないときのために簡易でいいからチェックできないかと思っておりました。

お礼日時:2011/05/26 19:42

https?:\/\/[\w\.-~\?&=\/]{4,}


がURLを調べる為に正しい表記かどうかは別として、
根本的に判定法が間違っています。

$url !~ /^https?:\/\/[\w\.-~\?&=\/]{4,}/
の記載は、前方に一致するものであって、
$url全てに適応するものではありません。

^で0文字目から指定しているのに対し、
終了位置が不明確な為、,(カンマ)など指定以外の文字があった時点で
判定を終了してしまうため、正常に判定できていません。

$urlの初めから最後までチェックしたいなら最後に$を入れ、
if($url !~ /^https?:\/\/[\w\.-~\?&=\/]{4,}$/) { }
とするべきですね。
    • good
    • 0
この回答へのお礼

ありがとうございます。
根本解決まではその修正を施して対応したいと思います。

ちょうど今
http://www.mukairiku.net/PerlModule/CgiPlus.pm.h …
このページを見て、
requireで保存したコードを呼び出し、
my $flag = UrlPatternCheck($url);
こんな感じでチェックしてみたのですが、internal server errorになってしまいます。
やはりあの難しいけど正しいチェック方法は簡単には利用できないのですかね?

お礼日時:2011/05/26 18:37

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