• ベストアンサー

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でも駄目でした。 他に何か書き方がありましたらご教授ください。

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

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

シンプルに、 if ( preg_match('/^$|^(http(以下略) として空行の正規表現で許容させちゃうとか。isset()も削って。

rusya
質問者

お礼

回答ありがとうございます。 ご指摘の方法で試してみたところ、動きました! 空行も正規表現で表せるんですね。ありがとうございました。

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

その他の回答 (1)

  • kuzumiHK
  • ベストアンサー率72% (132/183)
回答No.1

既存のif文のさらに外側に、 「もし、$_POST['url']が空じゃなかったら実行」 というif文を追加すると言うのではだめでしょうか。

rusya
質問者

お礼

早々の回答ありがとうございます。 実は試してみたのですが、結果は同じでした……。どうも$_POST['url']==""の状態を空と見なしていない気がします。

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

関連するQ&A

  • 正規表現の\\が認識されない?

    現在、PHPで正規表現を用いてURLをホスト名・パス名・クエリー部分を分けて出力するPGを作成しているのですが。 どうやら、'\\'が'\'(バックスラッシュ)として表現できていないようなのですが? なぜでしょうか? ご教授お願いいたします。 【PG】 $regexが正規表現内容 ↓ $regex = '/^(?:https?|ftp):\/\/([-.!~*\'()\w;:\@&=+\$,%#]+)\/?([-.!~*\'()\w;\/:\@&=+\$,%#]*)\??([\\-.!~*\'()\w;\/:\@&=+\$,%#]*)$/'; if( preg_match($regex, $str, $match) ) { echo $match[1]."\t".$match[2]."\t\n"; } else { echo "URLではありません。\n"; }

    • 締切済み
    • PHP
  • URL からドメイン名

    <?php preg_match('@^(?:http://)?([^/]+)@i', "http://www.hogehoge.net/index.html", $matches); $host = $matches[1]; preg_match('/[^.]+\.[^.]+$/', $host, $matches); echo $matches[0]"; ?> 上記だと、co.jpや ne.jpなどの場合うまく行きません。 正規表現もいまいちわかっていないのですが、 $host情報にco.jpなどを含む場合はこれでpreg_match()みたいな方法はないでしょうか?

    • 締切済み
    • PHP
  • preg_match関数で4-16桁の英数字かどうかをチェックしたい

    こんにちは☆ PHPでログインIDの入力フォームを作成していて、ユーザーの入力した文字が半角英数字のみで4桁以上16桁以内であるかどうかをpreg_match関数を用いてパターンチェックしたいのですが、うまくいきません。 (全角かな等が入っていてもtrueが返ってしまう。) どなたかご存知でしたらご指摘下さいm(_ _)m -------------------現在までの状況------------------------------- $login_id = $_POST["POSTされたユーザ入力"]; $login_id = mb_convert_kana($login_id, "a"); if (!preg_match("/[a-zA-Z0-9]{4,16}/", $login_id)) { echo "エラーメッセージ"; } ----------------------------------------------------------------

    • ベストアンサー
    • PHP
  • http://とhttps://のどちらでもマッチングできる正規表現

    http://とhttps://のどちらでもマッチングできる正規表現の書き方が分かりません。aタグの中のhref="のあとのURL部分にhttpでもhttpsのどちらでもOKのマッチングをかけたいです。 具体的にはhttp://www.aaa.co.jpでもhttps://www.aaa.co.jpのどちらでもpreg_match_allでマッチングをかけたいです。 $count=preg_match_all("正規表現",$URL,$maches); という感じでhttpかhttpsのURLに引っ掛けたいです。 教えてください

    • ベストアンサー
    • PHP
  • フォームから入力される値のチェックについて

    お世話になります。PHP勉強中の初心者です。 タイトルにありますようにフォームから入力される値のチェックについてわからないことがあるので質問いたします。 私は書籍やサイトなどの例を参考にして郵便番号の入力値チェック(ハイフンなし)を if(!preg_match("/^[0-9]{7}$/",$_POST[zipcode])){ //エラーメッセージ } else{ $zipcode = $_POST[zipcode]; } のように記述しています。 この場合、POSTのデータが改ざんされたとしても数値以外は受け付けないので、これだけで「入力された値は安全」と考えて良いのでしょうか。 また、もしもこれが安全だとするなら、かなり極端な例ですが、 if(!preg_match("/^[一-龠ぁ-んァ-ヴーa-zA-Z0-9a-zA-Z0-9\s\ \¥\(\)\(\)\「\」\!\”\’\% \%\&\&\’\~\-\-\+\+\<\>\.\,\,\、\。\_\_\;\:\:\『\』\【\】\[\]\/\@\?\=\=\÷\× \・\※\■\□\★\☆\▲\△\▼\▽\◎\○\●\〒\←\→\↑\↓\…]{1,50}$/u",$_POST[str])){ //エラーメッセージ } else{ $str = $_POST[str]; } とすれば、POSTデータをそのままHTML表示したりデータベースなどに受け渡しても問題ないのでしょうか(文字コードはサイト全体でUTF-8を使用)。もしこれで安全なら、{1,50}の箇所で文字数の上限・下限も同時にチェックできるので使う場所によってはけっこう便利かなと思うのですが。。。 ひとりで学習しているので、入力チェックやエスケープなどどのようにしたら安全なのかわからず日々手探りの状態が続いています。お時間があれば皆さんがよく使う入力チェックやエスケープのやり方などもご教授いただけると幸いです。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • <?php

    <?php session_start(); $_SESSION['name'] = $_POST['name']; $_SESSION['kana'] = $_POST['kana']; $_SESSION['nick'] = $_POST['nick']; $_SESSION['sex'] = $_POST['sex']; $_SESSION['pass'] = $_POST['pass']; $_SESSION['pass2'] = $_POST['pass2']; $_SESSION['mail'] = $_POST['mail']; if(empty($_SESSION['name'])) { $_SESSION['error'] = '名前を入力して下さい'; } if(empty($_SESSION['kana'])) { $_SESSION['error'] = 'フリガナを入力して下さい'; } if(empty($_SESSION['pass'])) { $_SESSION['error'] = 'パスワードを入力して下さい'; } if(empty($_SESSION['pass2'])) { $_SESSION['error'] = '確認用パスワードを入力して下さい'; } if($_SESSION['pass'] and $_SESSION['pass2'] and ($_SESSION['pass'] != $_SESSION['pass2'])){ $_SESSION['error'] = 'パスワードが一致しません'; } if (preg_match("/^[a-zA-Z0-9]{4,12}$/", $_SESSION["pass"])){ $_SESSION['error'] = 'パスワードは半角英数字で入力して下さい'; } if(isset($_SESSION["error"])) { header("Location: regist.php"); exit; } else { header("Location: index.php"); exit; } ?> で、PCからみるとエラーメッセージがでるのですが、自分の携帯(ドコモ)でみるとエラーメッセージが表示されていません・・・ なぜでしょうか?><; フォーム画面のソースは <?php if (isset($_SESSION["error"])) { echo $_SESSION["error"]; session_destroy(); } ?> </font> <font size="2"> <form action="error_check.php" name="form" method="post"> //ここからフォーム内容 です。 ご教授のほど宜しくお願い致します><;;;;;;; 補足 >GETで、セッション名に、session_id()で取得した値を渡してやる必要があります。 それはいったいどうやるんですか?><; 簡単でいいのでソースとか記述してくださればわかりやすいです><; お願い致します><;

    • 締切済み
    • PHP
  • SB携帯のサブスクライバID取得について

    はじめて投稿いたしました。 この度、携帯で会員制のコンテンツをリリースする予定でおりまして、 会員認証の場面等でサブスクライバIDをキーとしてユーザー判別を行お うとしております。 そこで、色々なサイトを参考とさせて頂きながら、下記の様なソースで サブスクライバIDを取得を試みました。 その結果、ドコモとAUは問題ありませんでしたが、SB携帯だけサブスクラ イバIDの取得ができませんでした。 SB公式サイトや各種情報サイトを参考に、色々ソースをいじってみたので すが、どーにも取得できません。 恐れ入りますが、どなたかお分かりになる方、不具合点のご指摘をお願い 申し上げます。 ---以下、ソース------------------------ $UA = $_SERVER['HTTP_USER_AGENT']; $HostName = @gethostbyaddr($_SERVER['REMOTE_ADDR']); // DoCoMo if ( preg_match("/.docomo.ne.jp/", $HostName) ) { preg_match("/ser([a-zA-Z0-9]+)/",$UA, $dprg); if ( strlen($dprg[1]) === 11 ) { $MobileInfo = $dprg[1]; } elseif ( strlen($dprg[1]) === 15 ) { $MobileInfo = $dprg[1]; preg_match("/icc([a-zA-Z0-9]+)/",$UA, $dpeg); if ( strlen($dpeg[1]) === 20 ) { $MobileInfo = $dpeg[1]; } else { $MobileInfo = false; } } else { $MobileInfo = false; } } //SBの処理はここから elseif( preg_match("Vodafone",$UA) || preg_match("SoftBank",$UA ) ) { // SoftBank if ( preg_match("//SN([a-zA-Z0-9]+)//",$UA,$vprg) ) { $MobileInfo = $vprg[1]; } else { $MobileInfo = false; } } //SBの処理はここまで elseif ( preg_match("/.ezweb.ne.jp/", $HostName) ) { // au $MobileInfo = $_SERVER['HTTP_X_UP_SUBNO']; }

    • 締切済み
    • PHP
  • ereg_match関数について

    こんばんは。PHP初めて間もないド素人です。とあるサイトを参考に、バイナリセーフ関数とかいうのととそうでない関数の処理の違いを検証してみようと思い、以下のコードを試してみました。 <?php //preg_match関数がバイナリセーフ関数である事を検証する。 //正規表現文字列にマッチしない文字があれば1を返す。 $kekka=preg_match('/[^a-zA-Z0-9_]/','oh_my_god\x00@'); $kekka2=ereg_match('/[^a-zA-Z0-9_]/','oh_my_god\x00@'); print($kekka); print("<br/>"); print($kekka2); ?> <!--<html>タグがないのにいきなり<br/> とか打っても大丈夫か試してみる。 print_rと打ってみたらなにか変わるか試してみる。--> <br/> <?php print_r($kekka); ?> これを試した結果、 Fatal error: Call to undefined function ereg_match() ...... というエラーがでました。ereg_match関数についてインターネットで 調べてみたのですがヒット率が異常に悪く「もしかしてpreg_match?」 とか表示されたりもしました。今php5を使ってますが、もしかして この関数はもうなくなった関数なのでしょうか?

    • ベストアンサー
    • PHP
  • PHP 複数行の正規表現

    複数行にわたる正規表現についてです。 mオプションを使うとありますが、うまくいきません。 [改行が無い場合] $val=$pattern_url="/<a>(.*?)<\/a>/m"; preg_match_all($pattern_url,"<a>ABCD</a>",$match_url,PREG_SET_ORDER); だと 1 ABCD が出力されます。 [改行がある場合] $val=$pattern_url="/<a>(.*?)<\/a>/m"; preg_match_all($pattern_url, "<a>AB CD</a>", $match_url,PREG_SET_ORDER); 出力結果は 0 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPのpreg系正規表現が正しいかチェックる方法

    お世話になります PHPのpreg系正規表現で入力された値が 正規表現として正しいかどうか調べたいのですが どのようにすれば良いのでしょうか? 「正しい」とは 導き出したい値が正しいかではなく 正規表現の記述方法が正しいかどうかです 「[]」と「{}」が正しく閉じているかチェックするだけでいいのかな?? チェック用の関数などあったら最高です (例) 正しい [0-9]{1,3} 上記をpreg系関数に入れると1~3文字の半角数字という意味になります 誤っている [0-9{1,3} 上記をpreg系関数に入れると、括弧が閉じていないので Compilation failedになります お忙しい中恐縮ですが 分かる方お助け下さいませ

    • ベストアンサー
    • PHP
このQ&Aのポイント
  • セキュリティソフトを一時的に休止させる方法と、その後の復帰方法について教えてください。
  • Windows11でセキュリティソフトによるインストール制限が発生した場合、一時的にセキュリティソフトを止めることで解決できます。復帰の方法も詳しく教えてください。
  • ソースネクスト株式会社の製品・サービスのセキュリティソフトを一時的に休止する方法と、その後の復帰方法について詳しく説明してください。
回答を見る

専門家に質問してみよう