• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:perlでurlが正しいか判定したい)

perlでURLの正当性を判定する方法

このQ&Aのポイント
  • perlでホームページのURLが正しいか判定する方法を探しています。ネットで検索してもメールアドレスの判定方法ばかりで、ホームページに関しては情報が見つかりません。
  • 既存の正規表現ではカンマのチェックなどがうまくできないため、正しいURLの判定方法についてアドバイスをお願いします。
  • 全角入力やスペース、句読点、特殊文字の入力ミスなどもチェックしたいので、URLの正当性を厳密に判定する方法を教えてください。

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

  • ベストアンサー
  • mikemike7
  • ベストアンサー率87% (97/111)
回答No.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%E8%A1%A8%E7%8F%BE"; 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";} ただ、正規表現が複雑になれば複雑になるほど、 サーバー負担も大きくなるということです。 当初の質問文には厳密にでなくてもかまわないとあったんですけどね・・・。

choei
質問者

お礼

大変詳しい解説ありがとうございました。 何とかうまくまとまりました。 >当初の質問文には厳密にでなくてもかまわないとあったんですけどね・・・。 確かに厳密でなくても良かったのですが、入力間違いに気づかないときのために簡易でいいからチェックできないかと思っておりました。

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

その他の回答 (1)

  • mikemike7
  • ベストアンサー率87% (97/111)
回答No.1

https?:\/\/[\w\.-~\?&=\/]{4,} がURLを調べる為に正しい表記かどうかは別として、 根本的に判定法が間違っています。 $url !~ /^https?:\/\/[\w\.-~\?&=\/]{4,}/ の記載は、前方に一致するものであって、 $url全てに適応するものではありません。 ^で0文字目から指定しているのに対し、 終了位置が不明確な為、,(カンマ)など指定以外の文字があった時点で 判定を終了してしまうため、正常に判定できていません。 $urlの初めから最後までチェックしたいなら最後に$を入れ、 if($url !~ /^https?:\/\/[\w\.-~\?&=\/]{4,}$/) { } とするべきですね。

choei
質問者

お礼

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

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

関連するQ&A