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

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

mikemike7の回答

  • ベストアンサー
  • 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
質問者

お礼

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

関連するQ&A

  • URLの内容チェックがうまくいきません

    $_POST['url']に何らかの値が格納されている場合のみ、正規表現で値をチェックしたいのですが、現在のソースでは$_POST['url']が空の場合も処理が正規表現に移ってしまい、結果エラーが出てしまいます。 if ( isset($_POST['url']) && preg_match('/^(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/', $_POST['url']) && mb_strlen($_POST['url']) <= 100){ 【データベース登録処理】 }else{ echo "エラー:入力内容が正しくありません"; } issetあたりが怪しいとは思うのですが、!emptyでも駄目でした。 他に何か書き方がありましたらご教授ください。

    • ベストアンサー
    • PHP
  • 正規表現で入力チェックするには。

    正規表現を使用して入力チェックをしようと考えていますが特殊記号文字がうまくいきません。 [0-9a-zA-Z]で英数字はチェックする事ができたんで下記の特殊文字を指定するとエラーになってしまい困っています。 「!"#$%&'()=~|`{+*}<>?_-^\@[;:],./」 ロジックは以下のように記述しています。 Pattern p = Pattern.compile("[0-9a-zA-Z!\"#$%&'()=~|`{+*}<>?_-^\\@[;:],./]"); Matcher m = p.matcher("文字列"); if(m.matches() == true){   System.out.println("1"); } else{   System.out.println("2"); } ※「\」と「"」はエスケープしています。 下記のエラーメッセージが表示されてなんとなくですが正規表現でエラーになっているのはわかるんですが・・・ Illegal character range near index 32 [0-9a-zA-Z!"#$%&'()=~|`{+*}<>?_-^\@[;:],./]                       ^ 申し訳ありませんがアドバイスいただけませんでしょうか? 宜しくお願いします。

    • ベストアンサー
    • Java
  • perlでの判定がうまくいきません

    $ref == 0 が正常に判定されていないようです。なぜでしょうか? また、if($tag =~ m/^tag$/ && $ref == 0){について、どのように改良するのが適切でしょうか? $| = 1; my $tag = "tag"; my $ref = "test"; if($ref eq ""){$ref = "0";} $ref =~ s/%([a-f\d]{2})/pack 'H2',$1/egi; if($tag =~ m/^tag$/ && $ref == 0){ print $ref; }

    • ベストアンサー
    • Perl
  • Perl 戻り値の型の判定って出来ますか?

    Perlは引数でのOUTを返せないと認識してます。 ※ここで間違っていたらご指摘下さい。 そのために下記のように、違った型(スカラー変数または配列)を返すように切り替えた場合に呼び側はどのように判定すれば良いのでしょうか?教えて下さい。 $result = sample(); sub sample{ $abc = "abc"; @xyz = qw(x y z); if(){ return $abc; } if(){ return @xyz; } return 0; }

    • ベストアンサー
    • Perl
  • 少数部の判定

    整数部2桁、小数部1桁まで入力可能なテキストの入力チェックは以下で正しいでしょうか。 コンパイラ環境は現在ないので確認お願いします。 ・以下でコンパイルエラーは発生しませんか ・入力チェックの方法として正しいでしょうか 間違いやまたよりよい方法がある場合はアドバイスください。 Dim a() as string a=Split(Text, ".") 'Textは入力値 If(UBound(0) = 1) Then '小数点が入力されたときはa=1となる If(length(a(0)) < 2) Then エラー Else If(length(a(1)) < 1) Then エラー End if Else If If(length(a(0)) < 2) Then エラー End If End If

  • utf-8の文字列に対してURLエンコードを行なうには?

    最近 perlをutf-8で書き始めたのですが、文字コードではまっています。 cgiの内部から別のcgiへpostで全角文字を送る場合 URLエンコードしてから送ると思うのですが 文字コードがutf-8の時、どのようにURLエンコードしたら 良いのか分からず困っています。どなたかご存知でしょうか? ちなみに文字を受ける方のcgiでは以下の様にURLデコードしています。 $data =~ tr/+/ /; $data =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; 試用しているperlのバージョンはperl5.8です、よろしくお願いします。

    • ベストアンサー
    • Perl
  • PHP 全角・半角・英数字 エラー判定

    PHPを独学で勉強しているものです、あるサイトを構築中で、入力内容のエラー判定をしたいのですが、どうしても半角英字がエラーではじかれず、どなたかご指導いただけますでしょうか。 PHPのバージョンは5.2で、DBはMySQLでユーザーがある情報を登録できるサイトで、データ型にあわせるため、1以上の半角数字のみ受け付けるようにしたいです。 入力欄は3か所で、$ic0、$ic1、$ic2に格納されています。 入力が全角数字の場合はそれぞれを半角数字に自動変換したいとおもっています。 自作したものは下記の通りです。 宜しくお願い致します。 /*エラー判定*/ $ic_check=$ic0.$ic1.$ic2; if(preg_match("/^[0-9]+$/", $ic_check)){ if($ic0=="0" || $ic1=="0" || $ic2=="0"){ $error_msg="1以上の数字を入れてください。"; }else{ $error_msg=""; } } elseif(preg_match("/^[0-90-9]+$/",$ic_check)){ $ic0=mb_convert_kana($ic0, "n", "Shift_jis"); $ic1=mb_convert_kana($ic1, "n", "Shift_jis"); $ic2=mb_convert_kana($ic2, "n", "Shift_jis"); if($ic0=="0" || $ic1=="0" || $ic2=="0"){ $error_msg="1以上の数字を入れてください。"; }else{ $error_msg=""; } } elseif(preg_match("/^[a-zA-Z]+$/",$ic_check)){ $error_msg="半角数字で入力してください"; } else{ $error_msg="半角数字で入力してください"; }

    • ベストアンサー
    • PHP
  • JavaScriptでフォームの入力項目をリアルタイムでチェックする「

    JavaScriptでフォームの入力項目をリアルタイムでチェックする「jQuery Form Validators」で全角カナや半角数字のみを入力できるようにすることはできますか? (参考にしたサイト) http://www.skuare.net/test/jvalidator.html フォームの入力項目で以下の入力のチェックが出来るようにしたいのですが可能でしょうか? ・全角カタカナのみで姓名の入力 ・半角数字のみで電話番号の入力 メールアドレスは、inputタグのサンプルにある部分をコピーすることで出来ました。 --------------------------------------- validExpress="[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?" --------------------------------------- validExpress=""の""の中を指定すれば良いのだと思うのですがどうしても解決せず、この場で質問させて頂いてます。 どうかご教授の程、宜しくお願い致します。

  • PerlプログラムをPHPで書き直しています

    Perlで作ったものをPHPで書き直しています。 似てるようで大変ですね。 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; という表現ですが、これをPHPで書き直すとズバリどのように なりますか? ちなみにPERLのソースコードでは、このあと &jcode'convert(*value,'sjis'); になるのですが、PHPでPerlのこの変換を実現する一般的方法が あったら教えてください。その方法で全部書き直そうと思います。

    • ベストアンサー
    • PHP
  • メールアドレス入力チェック

    毎回初心者な質問で申し訳ないです。 Strutsを使ってフォーム作成中なのですが、Validatorではなくjavaの中でエラーチェックをしています。 入力の有無でのエラーチェックはできたのですが、メールアドレスチェックができません。 自分としては 「1文字以上の半角英数記号」@「1文字以上の半角英数記号」 じゃなかったらエラーを返すようにしたいと思い以下のように記述しました。 if (mail != "[\\d[a-zA-Z]*]+@[\\d[a-zA-Z]*]"){ errors.add("mail", new ActionMessage("errors.mail")); } 動かしてみると何を入力してもエラーがかえるようになってしまいました。 正しい記述をご存知の方、ご教授ください。よろしくお願いいたします。

    • ベストアンサー
    • Java