以前電話番号の入力に関する質問をしていて、いろいろご回答頂き自分で取り組んだのですが、やはり分かりません。一様、下記のコードを制作したのですが、まだ、ちゃんと動かない状態です。なぜちゃんと動かないかお分かりの方、おられましたら教えて下さい。
電話番号の判定に関する正規表現
$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 '電話番号正確';
}
?>
コードを修正していただくか、正しいコードを教えていただければ幸いです。
コードが修正可能なら、修正していただいた方がどこを間違えていたのか理解しやすいです。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
簡単に・・
$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;
}
とか。
この回答への補足
mahimahi02さん
ご回答ありがとうございました。
mahimahi02さんのコードを参考にいろいろ自分で考えて見ます。
一旦スレッドを閉じます。
No.5
- 回答日時:
> 修正コードを教えて下さい。
// 条件(2)
if (strlen($mix) && (!strlen($tel1) || !strlen($tel2) || !strlen($tel3))) {
$tel_flg1 = 1;
}
> intなのかstringなのかはっきりしましょう。
$mixって書いたの私です、すいません。
ただ、リクエスト値はstringになりますし文字連結によってもstringになります。
PHPは思わぬところで型の問題が出るので気をつけます。?
> 修正コードを教えて下さい。
禁止事項「作業依頼」に触れそうなのでお気をつけ下さい。
No.4
- 回答日時:
なんだかなぁ・・・
いかにも「努力したくないです」なスタンスが見え隠れしててアドバイスするかどうか迷いましたが・・・
あと何故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_さんのいっておられることを完全には理解できません。
いずれにせよ、ご協力ありがとうございました。
No.3
- 回答日時:
どこかに入力があった時に$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);
}
}
こんな感じ。
No.1
- 回答日時:
条件(2)の処理がありません。
この回答への補足
tany180sxさん
ご回答ありがとうございました。
不足している部分が存在しているのは気が付いていますが、実際コードをどのように修正してよいものやら分かりません。修正コードを教えて下さい。そうしないと、いたちごっこです。
このスレッドでは修正コードをお聞きしています。
実際にコードを試してみてどのような動作が不足しているかは理解できているため、どのような処理が足りていないかの言葉の表現は余り必要ではありませ。足りない動作が分かっていてもコードをどのように修正したらよいか分からないからお聞きしています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) 入力フォームへ、データを自動的に入力するプログラム。どうやって作る? 4 2023/01/16 10:24
- Word(ワード) ワードで、任意の文字の前に、通し番号をつけたいです。 2 2022/09/15 02:40
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- Visual Basic(VBA) ActiveReportのdetailをデータセットの自動バインドを使って帳票を出力しています。 1 2023/08/16 07:16
- IT・エンジニアリング ActiveReportのdetailをデータセットの自動バインドを使って帳票を出力しています。 1 2023/08/16 07:17
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- 面接・履歴書・職務経歴書 履歴書の書き方について。 『 電話( ) - 』 と書かれている場合、どう記入すればいいですか?(父 1 2022/10/05 17:06
- その他(IT・Webサービス) CICでの情報開示について CICのインターネット開示を利用しているのですが、必要事項を入力後に確定 1 2023/04/04 16:11
- 国産車 エンジンスターター 2 2023/03/11 00:24
- au(KDDI) au pay バーコード読取りエラー エラー後aupay使用不可状態 2 2023/02/23 07:11
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Dosブロンプトでtabを出力したい
-
バッチファイルでpingの結果を...
-
switch()文で値の大小比較
-
shシェルスクリプト 空白行の...
-
findstrのerrorlevel
-
htmlで複数の個数入力欄を表示...
-
環境変数「%USERPROFILE%」の内...
-
syntax error, unexpected 'ech...
-
変数の中の<br>を消したい
-
被リンクの一覧を抜き出す正規...
-
[シェルスクリプト]ファイル変...
-
XMLのタグの有無をPHPで判定し...
-
PHP5で正規表現を使った文字の...
-
PHPで$_GET[’m’]の意味が分か...
-
小数点以下0の非表示
-
PHP 九九表
-
phpでcookieがうまく保存されない
-
変数の受け渡しによる画像の表示
-
phpの変数の初歩
-
PHPで訪問回数を表示するカウン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Dosブロンプトでtabを出力したい
-
switch()文で値の大小比較
-
バッチファイルでpingの結果を...
-
shシェルスクリプト 空白行の...
-
phpでcookieがうまく保存されない
-
findstrのerrorlevel
-
syntax error, unexpected 'ech...
-
小数点以下0の非表示
-
バッチファイルで、全てのウィ...
-
オブジェクトの中身の判定(PHP)
-
PHPで訪問回数を表示するカウン...
-
ゼロとNULLを区別して number_f...
-
bashの関数の引数にスペースが...
-
ナベアツプログラム(3の倍数...
-
変数の受け渡しによる画像の表示
-
PHP一覧表示した項目にリンクを...
-
Windowsのsetコマンドでの小数...
-
Parse error というエラーの対...
-
pdftkを使った処理をバッチファ...
-
DBのハッシュ化したパスワード...
おすすめ情報