![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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に間違いがないかチェックする方法はないでしょうか。
(特に . と , や : と ; や ~ と ^ の入力間違い、スペースが入っていないかとか全角入力になっていないかなどをチェックしたいです)
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% …
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";}
ただ、正規表現が複雑になれば複雑になるほど、
サーバー負担も大きくなるということです。
当初の質問文には厳密にでなくてもかまわないとあったんですけどね・・・。
大変詳しい解説ありがとうございました。
何とかうまくまとまりました。
>当初の質問文には厳密にでなくてもかまわないとあったんですけどね・・・。
確かに厳密でなくても良かったのですが、入力間違いに気づかないときのために簡易でいいからチェックできないかと思っておりました。
No.1
- 回答日時:
https?:\/\/[\w\.-~\?&=\/]{4,}
がURLを調べる為に正しい表記かどうかは別として、
根本的に判定法が間違っています。
$url !~ /^https?:\/\/[\w\.-~\?&=\/]{4,}/
の記載は、前方に一致するものであって、
$url全てに適応するものではありません。
^で0文字目から指定しているのに対し、
終了位置が不明確な為、,(カンマ)など指定以外の文字があった時点で
判定を終了してしまうため、正常に判定できていません。
$urlの初めから最後までチェックしたいなら最後に$を入れ、
if($url !~ /^https?:\/\/[\w\.-~\?&=\/]{4,}$/) { }
とするべきですね。
ありがとうございます。
根本解決まではその修正を施して対応したいと思います。
ちょうど今
http://www.mukairiku.net/PerlModule/CgiPlus.pm.h …
このページを見て、
requireで保存したコードを呼び出し、
my $flag = UrlPatternCheck($url);
こんな感じでチェックしてみたのですが、internal server errorになってしまいます。
やはりあの難しいけど正しいチェック方法は簡単には利用できないのですかね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(エンターテインメント・スポーツ) FA○ZAの動画ジャケット(サムネ)にはパネマジが施されているのでしょうか? 1 2023/08/13 14:12
- JavaScript ソースコードは下の共有コードサイト「張り紙」にあります。 入力フォームの javascript で 1 2022/05/11 11:01
- 野球 プロ野球で過去に西武にFA移籍した人っていますか? 流出ばかりで西武がFAで獲得したという話聞いたこ 1 2022/06/27 19:32
- 野球 原続投ならば… 5 2022/10/03 17:55
- 一眼レフカメラ ソニーのレンズの2つで迷っています、どちらが良いでしょうか?違いがよく分かりません。FE 28mm 2 2023/04/10 19:23
- 数学 至急、数学の問題について教えてください。 4 2022/09/11 07:26
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- 就職 生産技術職はFAの導入によって存在価値は薄れるものですか? 4 2022/05/11 07:34
- 野球 大谷翔平のfa権て確定してるなら休むべきではないですかよろしくお願いしますm(_ _)m 1 2023/08/27 17:10
- その他(ビジネス・キャリア) FA機器の無線スイッチ(の受信器)、シュナイダーのZBRRAの仕様について教えて下さい。 仕様では出 2 2022/08/13 21:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【至急!!!】python言語で本を見...
-
UWSCのSELECT文の記述方法
-
16進の10進変換について
-
c言語 16進数の2進数への変換
-
関数「exists」と「defined」の...
-
DBIがうんともすんとも言いませ...
-
$(ドル)の記号を表示したいの...
-
数値かどうかの判定方法
-
Perlにおける<?phpinfo();?>の...
-
Use of uninitialized value ---
-
pythonで演算子を変数に代入す...
-
掲示板からのメールの本文中に...
-
Python3
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
SELECT OPTIONの中身をコピペ...
-
FindFirst を複数条件で検索
-
構造体の各データの表示につい...
-
文字の横にプルダウンを表示さ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
16進の10進変換について
-
【至急!!!】python言語で本を見...
-
pythonで演算子を変数に代入す...
-
数値かどうかの判定方法
-
pythonの*
-
UWSCのSELECT文の記述方法
-
int(input("○○"))の使い方
-
関数「exists」と「defined」の...
-
c言語 16進数の2進数への変換
-
Perlにおける<?phpinfo();?>の...
-
シェルスクリプトで、空白(ス...
-
I2C接続のLCDディスプレイを使う
-
「HSP」でキャラコードを使って...
-
switch文のエラーについて
-
Use of uninitialized value ---
-
変数の中は文字列か数値か調べ...
-
perでメールが送信出来ない場合...
-
画面上再読み込みをさせたいの...
-
awkの正規表現での最左最短マッ...
-
数値英単語変換
おすすめ情報