- 締切済み
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"; }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- wp_
- ベストアンサー率54% (132/242)
失礼、回答書いてる間にロジック書かれてますな^^; >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"; とすると良いです。 この場合は前述の「横着」とは意味合いが違い、 「フラグを使用した手法」となります。
- wp_
- ベストアンサー率54% (132/242)
まず「何をしようとしたのか」書きましょう。 分かる人がみたら「そりゃ当然だ」で一蹴されて終わりです。 >$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 "数字以外を検出したっす";
補足
wp_さん ご回答ありがとうございました。 >まず「何をしようとしたのか」書きましょう。 himajin100000の回答への補足にこちらがやりたいことを細かく記載しましたので参考にしてください。私のコードも書きました(ちゃんと動きません)。 >上記三つの変数を数字か否か検査したい、と邪推しますが それもありますが、もう少し複雑です。
- himajin100000
- ベストアンサー率54% (1660/3060)
#!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"; } } ?>
補足
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 = 空欄 どなたかお分かりの方がおられましたら、コードを修正するかコードを教えて下さい。
お礼
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";」の判定結果を出力とはしたくないわけです。)
補足
wp_さん ご回答ありがとうございました。 >読んだ限り、1,2,3と4の間に関係は無さそうですね。 1,2,3と4の間に関係はあります。 関係は以下です。 3)$num4は空欄でも入力しても良いが、$num4を入力する場合は必ずnum1、 $num2及び$num3が入力されている必要がある。 つまり、 この場合、「echo "error」としたい。 $num1 = 空欄 $num2 = 空欄 $num3 = 空欄 $num4 = 101