- ベストアンサー
電話番号入力確認 やっぱり分かりません。
以前電話番号の入力に関する質問をしていて、いろいろご回答頂き自分で取り組んだのですが、やはり分かりません。一様、下記のコードを制作したのですが、まだ、ちゃんと動かない状態です。なぜちゃんと動かないかお分かりの方、おられましたら教えて下さい。 電話番号の判定に関する正規表現 $tel1は市外局番、 $tel2は市内局番、 $tel3はお客様番号 ついでに$tel4は内線番号としたい。 それでどのような判定を正規表現でしたいかというと 1)まず、この電話番号入力欄は入力しても空欄でもよい。 2)ただし、$tel1、 $tel2又は$tel3の一つにでも入力した場合は、他の二つにも(たとえば、$tel1に入力した場合には$tel2及び$tel3にも)必ず入力しなければならない。 3)$tel4は空欄でも入力しても良いが、$tel4を入力する場合は必ずtel1、 $tel2及び$tel3が入力されている必要がある。 4)tel1、 $tel2、$tel3及び$tel4に入力がある場合は、数字のみ可能。 これらの判定は、ばらばらに行なうのではなくまとめて行ないます。そのため結果は「電話番号正確」又は「電話番号不正確」のどちらかが1回のみ出力されるようにします。 以下は、目指す表示結果です。 この場合、「電話番号不正確」としたい。 $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 = 空欄 以下の私のコードはちゃんと動作しません。なぜか分かりません。 <?php $tel_flg1 = 0; $tel_flg2 = 0; $mix = $tel1 . $tel2 . $tel3; if ($tel1 != "" or $tel2 != "" or $tel3 !="" or $tel4 !=""){ if (!ereg("^[0-9]+$", $mix)) { $tel_flg1 = 1; } } if ($tel4 != ""){ if (!ereg("^[0-9]+$", $tel4)) { $tel_flg2 = 1; } } if ($tel_flg1 == 1 or $tel_flg2 == 1) { echo '電話番号不正確'; }else{ echo '電話番号正確'; } ?> コードを修正していただくか、正しいコードを教えていただければ幸いです。 コードが修正可能なら、修正していただいた方がどこを間違えていたのか理解しやすいです。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
簡単に・・ $flag = false; if( ( $tel1 != "" ) || ( $tel2 != "" ) || ( $tel3 != "" ) ){ if( ( $tel1 != "" ) && ( $tel2 != "" ) && ( $tel3 != "" ) ){ $tel = $tel1.$tel2.$tel3; if( ereg("^[0-9]+$", $tel ) ){ if( ( $tel4 == "" ) || ( ereg("^[0-9]+$", $tel4 ) ) ){ $flag = true; } } } } else if( ( $tel1 == "" ) && ( $tel2 == "" ) && ( $tel3 == "" ) && ( $tel4 == "" ) ){ $flag = true; } とか。
その他の回答 (4)
- tany180sx
- ベストアンサー率63% (239/379)
> 修正コードを教えて下さい。 // 条件(2) if (strlen($mix) && (!strlen($tel1) || !strlen($tel2) || !strlen($tel3))) { $tel_flg1 = 1; } > intなのかstringなのかはっきりしましょう。 $mixって書いたの私です、すいません。 ただ、リクエスト値はstringになりますし文字連結によってもstringになります。 PHPは思わぬところで型の問題が出るので気をつけます。? > 修正コードを教えて下さい。 禁止事項「作業依頼」に触れそうなのでお気をつけ下さい。
補足
tany180sxさん ご回答ありがとうございました。 上記の件、了解しました。
- wp_
- ベストアンサー率54% (132/242)
なんだかなぁ・・・ いかにも「努力したくないです」なスタンスが見え隠れしててアドバイスするかどうか迷いましたが・・・ あと何故ereg()に拘るのか理解に苦しむ・・・ データフロー図は書きましたか。 当方、何度か「フロー図すら描かずいきなりソースを書き始める新人」を見てきましたが そういう奴は決まって全く成長しません。 言っても書かない馬鹿は首を切られていきました。(使えないから) ロジカルな思考が十二分に出来ないうちは必ず紙に書きましょう。 intなのかstringなのかはっきりしましょう。 連結してチェックするアイデア自体は素晴らしいですが、 intの思い込みで思わぬオーバーフローを引き起こす可能性があります。 No.3の方の言うとおりnullチェックが曖昧にもなるし。 function check($arg) { if($arg === "") return null; if(!is_numeric($arg)) return false; return true; } $status1 = check($n1); $status2 = check($n2); $status3 = check($n3); $status4 = check($n4); $ret = false; if( is_null($status1) && is_null($status2) && is_null($status3) && is_null($status4) ) $ret = true; if( $status1 && $status2 && $status3 && $status4 !== false ) $ret = true; ここまで書いて駄目でしたら僕の方からはお手上げです。
補足
wp_さん ご回答ありがとうございました。 wp_さんは、かなり知識をおもちのようですが、残念ながら今の私にはwp_さんのいっておられることを完全には理解できません。 いずれにせよ、ご協力ありがとうございました。
- grumpy_the_dwarf
- ベストアンサー率48% (1628/3337)
どこかに入力があった時に$mixが数値であることを確認したので は、tel1~tel3までに全部入ってるか判りません。どれか一つだけ に入力があってもオッケーになっちゃいます。ここは、「$mixが空 じゃない」をどこかに何か入力があった指標にして、tel1~tel3ま でが数値である確認を個別にすべきです。 たとえば $flag = true; $mix = $tel1 . $tel2 . $tel3 . $tel4; if(strlen($mix)) { $flag = is_numeric($tel1) && is_numeric($tel2) && is_numeric($tel3); if(strlen($tel4)) { $flag = $flag && is_numeric($tel4); } } こんな感じ。
補足
grumpy_the_dwarfさん ご回答ありがとうございました。 参考にさせて頂きます。
- tany180sx
- ベストアンサー率63% (239/379)
条件(2)の処理がありません。
お礼
このスレッドでは修正コードをお聞きしています。 実際にコードを試してみてどのような動作が不足しているかは理解できているため、どのような処理が足りていないかの言葉の表現は余り必要ではありませ。足りない動作が分かっていてもコードをどのように修正したらよいか分からないからお聞きしています。
補足
tany180sxさん ご回答ありがとうございました。 不足している部分が存在しているのは気が付いていますが、実際コードをどのように修正してよいものやら分かりません。修正コードを教えて下さい。そうしないと、いたちごっこです。
補足
mahimahi02さん ご回答ありがとうございました。 mahimahi02さんのコードを参考にいろいろ自分で考えて見ます。 一旦スレッドを閉じます。