• 締切済み

電話番号 正規表現

このスレッドは、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]以外にも「+」なども受け付けてしまったような気がする。 どなたかお分かりの方がおられましたら、コードを修正するかコードを教えて下さい。

みんなの回答

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.2

とりあえず書いてみましたが、正規表現の質問というわけでもないですし もう少しご自分で練った方がいいですね。 echo isValidTel('123', '', '789', '') . '<br />'; echo isValidTel('a', '456', '789', '') . '<br />'; echo isValidTel('', '', '', '101') . '<br />'; echo isValidTel('123', '456', '789', 'a') . '<br />'; echo isValidTel('123', '456', '789', '') . '<br />'; echo isValidTel('123', '456', '789', '101') . '<br />'; echo isValidTel('', '', '', '') . '<br />'; function isValidTel($tel1, $tel2, $tel3, $tel4) { echo "$tel1 - $tel2 - $tel3 - $tel4 = "; $mix = $tel1 . $tel2 . $tel3 . $tel4; if (!strlen($mix)) { return 'okey(empty).'; } if (!preg_match('/^[0-9]+$/', $mix)) { return 'error.'; } if (!strlen($tel1) || !strlen($tel2) || !strlen($tel3)) { return 'error.'; } return 'okey.'; }

kitty1000
質問者

補足

tany180sさん ご回答ありがとうございました。 理解にしばらく時間がかかります。

すると、全ての回答が全文表示されます。
  • wp_
  • ベストアンサー率54% (132/242)
回答No.1

書いてたら前のスレッドが潰れたのでこちらで。 ここまできたら丸投げに近いと思うので多少は試行錯誤したほうが良いです。 ヒントだけ挙げておきますと、1,2,3をチェックしたフラグと4をチェックしたフラグの状態で場合分けし、処理の振り分けを行えばよいです。 具体的なソースは既に挙げておりますので書きません。 >下記の条件を一まとめにして 前スレの私のソースをよく読みましょう。 一度も実行せず脳内完結しているうちは理解が進まないでしょう。 >としたいのだが、私の記憶ではis_numericを使用した場合は空欄を受け付けなかったと思う。つまり下記が正しく判定できない。 空欄の判別をしたいのであればdataを受け取った際にisset()で確認するなり何なりでnullチェックを行えばよいだけのこと。 >また、is_numericは[0-9]以外にも「+」なども受け付けてしまったような気がする。 echo is_numeric('+') ?"true" :"false"; //false

kitty1000
質問者

補足

wpさん ご回答ありがとうございました。 下記のコードをしたのですが、ただしくうごきません。 tel_flg1 = true; tel_flg2 = true; $mix = $tel1 . $tel2 . $tel3 . $tel4; $tel_length = strlen($mix) if ($tel_length != 0 ) { if (!ereg("^[0-9]+$", $mix)) { tel_flg1 = false; } } if (!strlen($tel1) or !strlen($tel2) or !strlen($tel3)) { tel_flg2 = false; } if (tel_flg1 = false or tel_flgs2 = false) { echo '電話番号不正確'; } else { echo '電話番号正確'; } ちゃんと動作しないパターンは以下です。 この場合、「電話番号不正確」としたい。 $tel1 = a $tel2 = 456 $tel3 = 789 $tel4 = 空欄 この場合、「電話番号不正確」としたい。 $tel1 = 123 $tel2 = 456 $tel3 = 789 $tel4 = a この場合、「電話番号不正確」としたい。 $tel1 = 空欄 $tel2 = 空欄 $tel3 = 空欄 $tel4 = 101

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

関連するQ&A