• 締切済み

PHP 正規表現 数字又は数字以外を判別

下記コードですが、 「数字以外が含まれています。」と表示されるはずなのに「数字です。」と表示されてしまいます。どこがおかしいかお分かりの方おられますか? $num1 ="123"; $num2 ="a"; $num3 ="123"; if($num1 != "" or $num2 != "" or $num3 != "") { if($num1 == "" or $num2 == "" or $num3 == "") { if(!ereg("^[0-9]+$", $num1) or !ereg("^[0-9]+$", $num2) or !ereg("^[0-9]+$", $num3)) { print "数字以外が含まれています。\n"; } } } else { print "数字です。\n"; }

  • PHP
  • 回答数3
  • ありがとう数1

みんなの回答

  • wp_
  • ベストアンサー率54% (132/242)
回答No.3

失礼、回答書いてる間にロジック書かれてますな^^; >1)まず、この電話番号入力欄は入力しても空欄でもよい。 >2)ただし、$num1、 $num2又は$num3の一つにでも入力した場合は、他の二つにも(たとえば、$num1に入力した場合には$num2及び$num3にも)必ず入力しなければならない。 >3)$num4は空欄でも入力しても良いが、$num4を入力する場合は必ずnum1、 $num2及び$num3が入力されている必要がある。 >4)num1、 $num2、$num3及び$num4に入力がある場合は、数字のみ可能。 まず $num1,$num2,$num3 と $num4 で分けて考えるべきです。 // 読んだ限り、1,2,3と4の間に関係は無さそうですね。 $num4に関してはis_numeric()を一回噛ませばそれで終わりです。 if(!is_numeric($num4))  echo "error"; 1,2,3の連携ですが、方法はいろいろあります。 正直にやるならば $num1を検査  →NGならエラー  →OKなら$num2を検査   →NGならエラー   →OKなら$num3を検査    →NGならエラー    →OKなら正常処理 でよいです。こうすると「全て正常値のときのみ正常処理」されることになります。 が、コードを見ると入れ子だらけで美しくないので、 $ret1 = true; $ret2 = true; $ret3 = true; if( ! is_numeric($num1))  $ret1 = false; if( ! is_numeric($num2))  $ret2 = false; if( ! is_numeric($num3))  $ret3 = false; if($ret1 and $ret2 and $ret3)  echo "正常"; else  echo "error"; とすると良いです。 この場合は前述の「横着」とは意味合いが違い、 「フラグを使用した手法」となります。

kitty1000
質問者

お礼

wp_さん >$num1,$num2,$num3 >と >$num4 >で分けて考えるべきです。 $num1,$num2,$num3と$num4の判定結果「echo "正常";」又は「echo "error";」は、ばらばらに出力せずに一まとめにしたいのですが。 つまり下記の条件を一まとめにして >1)まず、この電話番号入力欄は入力しても空欄でもよい。 >2)ただし、$num1、 $num2又は$num3の一つにでも入力した場合は、他の二つにも(たとえば、$num1に入力した場合には$num2及び$num3にも)必ず入力しなければならない。 >3)$num4は空欄でも入力しても良いが、$num4を入力する場合は必ずnum1、 $num2及び$num3が入力されている必要がある。 >4)num1、 $num2、$num3及び$num4に入力がある場合は、数字のみ可能。 一度だけ、「echo "正常";」又は「echo "error";」を出力したいわけです。(num1,$num2,$num3で、「echo "正常";」又は「echo "error";」の判定結果を出力、そして、別途、$num4で、「echo "正常";」又は「echo "error";」の判定結果を出力とはしたくないわけです。)

kitty1000
質問者

補足

wp_さん ご回答ありがとうございました。 >読んだ限り、1,2,3と4の間に関係は無さそうですね。 1,2,3と4の間に関係はあります。 関係は以下です。 3)$num4は空欄でも入力しても良いが、$num4を入力する場合は必ずnum1、 $num2及び$num3が入力されている必要がある。 つまり、 この場合、「echo "error」としたい。 $num1 = 空欄 $num2 = 空欄 $num3 = 空欄 $num4 = 101

  • wp_
  • ベストアンサー率54% (132/242)
回答No.2

まず「何をしようとしたのか」書きましょう。 分かる人がみたら「そりゃ当然だ」で一蹴されて終わりです。 >$num1 ="123"; >$num2 ="a"; >$num3 ="123"; 上記三つの変数を数字か否か検査したい、と邪推しますが その場合はきちんとロジックを三つに分けましょう。 >if($num1 != "" or $num2 != "" or $num3 != "") { こちらはいわゆる「横着」なやり方で、バグの温床になります。 出来れば共通部分を関数化したほうが良いでしょう。 三つ同時に検査する必要がある、というのであればまずはロジックをデータフロー図に落とすところから始めましょう。 Wikipedia データフロー図 http://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%83%AD%E3%83%BC%E3%83%80%E3%82%A4%E3%82%A2%E3%82%B0%E3%83%A9%E3%83%A0 幸いに、「数字か否か」のチェックはPHPの既存の関数でis_numeric()というものがあります。 こちらを使った方が見やすく かつ 早いです。 // それぞれ検査 $num1 ="123"; $num2 ="a"; $num3 ="123"; if(is_numeric($num1))  echo "num1は数字でした。"; if(is_numeric($num2))  echo "num2は数字でした。"; if(is_numeric($num3))  echo "num3は数字でした。"; // 三つ絡んだ検査 (snip) $ret = false; if( ! is_numeric($num1))  $ret = true; if( ! is_numeric($num2))  $ret = true; if( ! is_numeric($num3))  $ret = true; if($ret)  echo "数字以外を検出したっす";

参考URL:
http://jp2.php.net/is_numeric
kitty1000
質問者

補足

wp_さん ご回答ありがとうございました。 >まず「何をしようとしたのか」書きましょう。 himajin100000の回答への補足にこちらがやりたいことを細かく記載しましたので参考にしてください。私のコードも書きました(ちゃんと動きません)。 >上記三つの変数を数字か否か検査したい、と邪推しますが それもありますが、もう少し複雑です。

回答No.1

#!C:/Environment/PHP/v5.2.4/php-cgi.exe <?php $num1 ="123"; $num2 ="a"; $num3 ="123"; if($num1 != "" or $num2 != "" or $num3 != "") { /* そもそもこれが間違い、って話じゃなくって? if($num1 == "" or $num2 == "" or $num3 == "") { これがあったときに通る条件って 「一つ以上空文字列でない変数が存在する」かつ,「空文字列である変数が一つ以上ある」だよ? */ if(!ereg("^[0-9]+$", $num1) or !ereg("^[0-9]+$", $num2) or !ereg("^[0-9]+$", $num3)) { print "数字以外が含まれています。\n"; } else { /* 多分これが意図だろうと思って内側に持ってきた */ print "数字です。\n"; } } ?>

kitty1000
質問者

補足

himajin100000さん ご回答ありがとうございました。 そもそもnumには電話番号が入ります。 $num1は市外局番、 $num2は市内局番、 $num3はお客様番号 ついでに$num4は内線番号としたい。 それでどのような判定を正規表現でしたいかというと 1)まず、この電話番号入力欄は入力しても空欄でもよい。 2)ただし、$num1、 $num2又は$num3の一つにでも入力した場合は、他の二つにも(たとえば、$num1に入力した場合には$num2及び$num3にも)必ず入力しなければならない。 3)$num4は空欄でも入力しても良いが、$num4を入力する場合は必ずnum1、 $num2及び$num3が入力されている必要がある。 4)num1、 $num2、$num3及び$num4に入力がある場合は、数字のみ可能。 これってどのようなコードになるのでしょうか? ちなみに私が考えているコードを書いときますが、数字以外でも入力できてしまいます。入力がある場合は、数字しか入力できないようにしているはずなのに... *$numの表現を$telに変更しています。 <?php if($tel1 != "" or $tel2 != "" or $tel3 != "") { if($tel1 == "" or $tel2 == "" or $tel3 == "") { if(!ereg("^[0-9]+$", $tel1) or !ereg("^[0-9]+$", $tel2) or !ereg("^[0-9]+$", $tel3) or !ereg("^([0-9]+|\t)$", $tel4)) { echo '電話番号不正確'; } } }else{ echo '電話番号正確'; } ?> 以下は、目指す表示結果です。 この場合、「電話番号不正確」としたい。 $tel1 = 123 $tel2 = 空欄 $tel3 = 789 $tel4 = 空欄 この場合、「電話番号不正確」としたい。 $tel1 = a $tel2 = 456 $tel3 = 789 $tel4 = 空欄 この場合、「電話番号不正確」としたい。 $tel1 = 空欄 $tel2 = 空欄 $tel3 = 空欄 $tel4 = 101 この場合、「電話番号不正確」としたい。 $tel1 = 123 $tel2 = 456 $tel3 = 789 $tel4 = a この場合、「電話番号正確」としたい。 $tel1 = 123 $tel2 = 456 $tel3 = 789 $tel4 = 空欄 この場合、「電話番号正確」としたい。 $tel1 = 123 $tel2 = 456 $tel3 = 789 $tel4 = 101 この場合、「電話番号正確」としたい。 $tel1 = 空欄 $tel2 = 空欄 $tel3 = 空欄 $tel4 = 空欄 どなたかお分かりの方がおられましたら、コードを修正するかコードを教えて下さい。

関連するQ&A

  • 文字列チェックの動作がおかしい・・・

    フォームのメールアドレスチェックで動作がおかしいです。 自分では、問題がないと思っているのですが、どこかおかしなところがあればご指摘ただければと思います。 動作確認を簡単にするために作ったソースは if(!ereg("^[0-9a-zA-Z\_\.\-\@]+$",'k_kkkk@kkkkk-kkkkk.com')) { print "NG1\n"; }else { print "OK1\n"; } if(!ereg("^[0-9a-zA-Z\_\.\-\@]+$",'kkkkk@kkkkk-kkkkk.com')) { print "NG2\n"; }else { print "OK2\n"; } if(!ereg("^[0-9a-zA-Z\_\.\-\@]+$",'k_kkkk@kkkkkkkkkk.com')) { print "NG3\n"; }else { print "OK3\n"; } if(!ereg("^[0-9a-zA-Z\_\.\-\@]+$",'kkkkk@kkkkkkkkkk.com')) { print "NG4\n"; }else { print "OK4\n"; } if(!ereg("[0-9a-zA-Z\_\.\-\@]+$",'k_kkkk@kkkkk-kkkkk.com')) { print "NG5\n"; }else { print "OK5\n"; } if(!ereg("[0-9a-zA-Z\_\.\-\@]+$",'kkkkk@kkkkk-kkkkk.com')) { print "NG6\n"; }else { print "OK6\n"; } if(!ereg("[0-9a-zA-Z\_\.\-\@]+$",'k_kkkk@kkkkkkkkkk.com')) { print "NG7\n"; }else { print "OK7\n"; } if(!ereg("[0-9a-zA-Z\_\.\-\@]+$",'kkkkk@kkkkkkkkkk.com')) { print "NG8\n"; }else { print "OK8\n"; } です。予想していた結果は、全てOKとなるはずだったのですが、予想に反して NG1 NG2 OK3 OK4 OK5 OK6 OK7 OK8 となり、マッチングパターン部分が「^[0-9a-zA-Z\_\.\-\@]+$」となっているときだけ、ハイフンが文字列に含まれていると、予想と違っています。 自分的には??なのですが・・・ どこがおかしいのか、ご指摘いただければと思います。 長文ですみません。

    • ベストアンサー
    • PHP
  • 正規表現 文中空白可能

    ereg関数を使用してフォームの「ふりがな」のチェックをしていますが、ふりがなの文中に空白が含まれていてもチェックにひっかからないようにする(下記コードで「ふりがなOK」と表示する)には、どのようにすればよいのでしょうか? 私が、現在、トライしているコードです。 if (!ereg("^([あ-ん])+([あ-んー\s])*$", $applicant_kana)) { echo 'ふりがなエラー'; } else { echo 'ふりがなOK'; } 上記のコードで、「これは ふりがなです」と入力した場合に「ふりがなOK」と表示させたいのです。文中に空白が存在しても「ふりがなOK」と表示されるように\sを使用しましたが、現在のコードでは文中に空白があると「ふりがなエラー」と表示されてしまいます。 mb_eregではなく、eregを使用していますが、私の環境ではプログラムの動作に問題は起きていません。mb_eregでも検証しましたが、動作に違いはありませんでした。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPの正規表現「ereg」で特定の数字範囲をマッチさせたい

    PHPの正規表現「ereg」で特定の数字範囲をマッチさせたい 宜しくお願い致します。 PHPの正規表現で、0~99までの数字があり、そのうち、「4~6」と「11~15」までの数字以外の場合にマッチさせる正規表現について教えて下さい。 自分なりに作ってみた正規表現パターンは下記の通りです。 ereg("([^4-6]{1})|[^11-15])",$hoge) もしくは ereg("([^4-6]{1})|[^11-15]{2})",$hoge) で試してみましたが、「4~6」はマッチしないのですが、「11~15」の時にもマッチしてしまいます。 どうすればいいのか、どなたか助けて下さいー!

    • ベストアンサー
    • PHP
  • 正規表現の書き方に困っております。

    あるSQLのダンプを変換するプログラムをPerlで書いているのですが、 うまく正規表現が書けなくて困っております。 データの途中に,が有ると、うまくいきません。 ''の中に囲まれた,は無視するという正規表現を書きたいのです。 また、'''B'も正しく処理できれば、完璧です。 #!/usr/bin/perl use strict; use warnings; #my $a = qq{'A','B',1}; --> うまくいく  ['A']['B'][1] #my $a = qq{'A,','B',1}; --> うまくいかない ['A] ['] ['] my $a = qq{',','''B',1}; --> もっとうまくいかない ['][']['] if($a =~ /(.+?),(.+?),(.+?)/){ print "[$1]\n"; print "[$2]\n"; print "[$3]\n"; }else{ print "ERR!\n"; } exit; __END__

    • ベストアンサー
    • Perl
  • 正規表現について

    いつもお世話になっております。 perlの正規表現で分からない事があります。 ご存知の方がいらっしゃれば、アドバイスを頂けますようよろしくお願い致します。 (質問内容) 以下のようなプログラムを実行した場合、matchが出力されてしまいます。 $aには、「、IS」を設定しているので、「真」と扱われないと思うのですが、何故、matchが出力されるのでしょうか? また、「偽」として処理をいしたい場合、 どのようにすればよろしいのでしょうか? #!/usr/bin/perl $a = "、IS"; $b = "AIS"; if ($a =~ $b){ print "match\n"; } else{ print "not match\n"; }

  • 正規表現に関する質問

    以前もここで質問したものです。皆様の解答をヒントに一歩進みました。 C言語のソースコードを扱っています。 デバッグのため(関数がどういう順番で呼び出されているかを知るため)、関数の先頭にprint文をつけようと思っています。 例えば、 int hoge(引数の並び) { 関数の中身 } なら int hoge(引数の並び) { printf("hoge"); 関数の中身 } といった具合です。 関数が膨大なので、手作業で一つずつprintfを書くのは現実的ではありません。 ここで、 open(IN,"$ARGV[0]"); @array = <IN>; for($i=0;$i<@array;$i++){ if($array[$i] =~ / _*.+\(.*\)/){ $tmp = $&; if($array[$i+1] =~ "^{\n"){ print $array[$i]; print $array[$i+1]; print "printf(\"FileName:$ARGV[0] FunctionName:"; print $tmp; print "\");"; print "\n"; $i++;} else{ print $array[$i]; } }else{ print $array[$i]; } } というコードを書きました。しかしこれでもうまくいかないケースが多々ありました。 int main(void) { intro(); new_game(); /* @@@ exit(0); */ /* causes a warning in C++ */ return(0); } のように返り値が横ではなく上についていたり、 void __ast_string_field_index_build(struct ast_string_field_mgr *mgr, ast_string_field *fields, int num_fields, int index, const char *format, ...) { のように引数が複数行にわたる場合です。 どのようにしたらよいのでしょうか。 どなたか教えてもらえませんか?

    • ベストアンサー
    • Perl
  • Python 構文のミスについて。

    プログラミングの初心者です。 下のプログラミングですが、どこが間違えているのでしょうか? まず数字を入力して、それがコンピュータがランダムに選んだ数字と同じ であれば、あたりが表示され、ちがうのであればはずれと表示するのですが、 何回数字を入力しても、はずれしか表示されません、どうしてでしょうか、 ご指摘よろしくお願いします。 #coding:shift-jis import random try: while True: num_1 = range(10) num_2 = raw_input('数字を入力してください\n') if len(num_2) == 0: break if num_2 == random.randint(num_1): print('あたりです') else: print('はずれです') except: print('error!') print('終わり')

  • 電話番号 正規表現

    このスレッドは、http://oshiete1.goo.ne.jp/qa3565776.htmlから移動してきました。私が追記する欄がなくなってしまったことと、内容をまとめたかったからです。マルチスレッドにならないように以前のスレッドは締め切ります。 電話番号の判定に関する正規表現 $tel1は市外局番、 $tel2は市内局番、 $tel3はお客様番号 ついでに$tel4は内線番号としたい。 それでどのような判定を正規表現でしたいかというと 1)まず、この電話番号入力欄は入力しても空欄でもよい。 2)ただし、$tel1、 $tel2又は$tel3の一つにでも入力した場合は、他の二つにも(たとえば、$tel1に入力した場合には$tel2及び$tel3にも)必ず入力しなければならない。 3)$tel4は空欄でも入力しても良いが、$tel4を入力する場合は必ずtel1、 $tel2及び$tel3が入力されている必要がある。 4)tel1、 $tel2、$tel3及び$tel4に入力がある場合は、数字のみ可能。 これってどのようなコードになるのでしょうか? ちなみに私が考えているコードを書いときますが、数字以外でも入力できてしまいます。入力がある場合は、数字しか入力できないようにしているはずなのに... <?php if($tel1 != "" or $tel2 != "" or $tel3 != "") { if($tel1 == "" or $tel2 == "" or $tel3 == "") { if(!ereg("^[0-9]+$", $tel1) or !ereg("^[0-9]+$", $tel2) or !ereg("^[0-9]+$", $tel3) or !ereg("^([0-9]+|\t)$", $tel4)) { echo '電話番号不正確'; } } }else{ echo '電話番号正確'; } ?> 以下は、目指す表示結果です。 この場合、「電話番号不正確」としたい。 $tel1 = 123 $tel2 = 空欄 $tel3 = 789 $tel4 = 空欄 この場合、「電話番号不正確」としたい。 $tel1 = a $tel2 = 456 $tel3 = 789 $tel4 = 空欄 この場合、「電話番号不正確」としたい。 $tel1 = 空欄 $tel2 = 空欄 $tel3 = 空欄 $tel4 = 101 この場合、「電話番号不正確」としたい。 $tel1 = 123 $tel2 = 456 $tel3 = 789 $tel4 = a この場合、「電話番号正確」としたい。 $tel1 = 123 $tel2 = 456 $tel3 = 789 $tel4 = 空欄 この場合、「電話番号正確」としたい。 $tel1 = 123 $tel2 = 456 $tel3 = 789 $tel4 = 101 この場合、「電話番号正確」としたい。 $tel1 = 空欄 $tel2 = 空欄 $tel3 = 空欄 $tel4 = 空欄 以下のコードをwpさんに教えてもらったが、現在、以下の問題点が存在する。 <?php if(!is_numeric($tel4))  echo "電話番号不正確"; ?> <?php $ret1 = true; $ret2 = true; $ret3 = true; if( ! is_numeric($tel1))  $ret1 = false; if( ! is_numeric($tel2))  $ret2 = false; if( ! is_numeric($tel3))  $ret3 = false; if($ret1 and $ret2 and $ret3)  echo "電話番号正確"; else  echo "電話番号不正確"; ?> 問題1)上記のコードではtel4をtel1,tel2,$tel3から切り離して取り扱っているため下記がただしく判定できない。 この場合、「電話番号不正確」としたい。 $tel1 = 空欄 $tel2 = 空欄 $tel3 = 空欄 $tel4 = 101 問題2) 下記の条件を一まとめにして >1)まず、この電話番号入力欄は入力しても空欄でもよい。 >2)ただし、$tel1、 $tel2又は$tel3の一つにでも入力した場合は、他の二つにも(たとえば、$tel1に入力した場合には$tel2及び$tel3にも)必ず入力しなければならない。 >3)$tel4は空欄でも入力しても良いが、$tel4を入力する場合は必ずtel1、 $tel2及び$tel3が入力されている必要がある。 >4)tel1、 $tel2、$tel3及び$tel4に入力がある場合は、数字のみ可能。 一度だけ、「echo "電話番号正確";」又は「echo "電話番号不正確";」を出力したいわけですが、それができない。($tel1,$tel2,$tel3で、「echo "電話番号正確";」又は「echo "電話番号不正確";」の判定結果を出力、そして、別途、$tel4で、「echo "電話番号正確";」又は「echo "電話番号不正確";」の判定結果を出力とはしたくないわけです。) 問題3) >1)まず、この電話番号入力欄は入力しても空欄でもよい。 としたいのだが、私の記憶ではis_numericを使用した場合は空欄を受け付けなかったと思う。つまり下記が正しく判定できない。 この場合、「電話番号正確」としたい。 $tel1 = 空欄 $tel2 = 空欄 $tel3 = 空欄 $tel4 = 空欄 また、is_numericは[0-9]以外にも「+」なども受け付けてしまったような気がする。 どなたかお分かりの方がおられましたら、コードを修正するかコードを教えて下さい。

    • 締切済み
    • PHP
  • 正規表現を表示させたい

    今正規表現をしているのですが、どうやってブラウザーで表示できるのでしょうか?わかっている人にとってはめちゃくちゃくだらないことだと思うのですが、よろしくお願いします。下記のコードです。 <?php $str = "There is no pen . I want a pencil . "; ereg_replace("pen(cil)?", "pencil", $str ); ?>

    • ベストアンサー
    • PHP
  • 正規表現で「チルダ(~)」をマッチさせたい

    正規表現でチルダをマッチさせたいのですが、うまくマッチしません。 if(ereg("~",$urlVars){ $a=1; }else{ $a=0; } $urlVarsには、フォームで送られてくるURLのアドレスが格納されます。よって、URLアドレスの「~」チルダを認識したいのです。

    • 締切済み
    • PHP

専門家に質問してみよう