PHP 全角・半角・英数字 エラー判定

このQ&Aのポイント
  • PHPを独学で勉強しているものです、あるサイトを構築中で、入力内容のエラー判定をしたいのですが、どうしても半角英字がエラーではじかれず、どなたかご指導いただけますでしょうか。
  • PHPのバージョンは5.2で、DBはMySQLでユーザーがある情報を登録できるサイトで、データ型にあわせるため、1以上の半角数字のみ受け付けるようにしたいです。
  • 入力欄は3か所で、$ic0、$ic1、$ic2に格納されています。入力が全角数字の場合はそれぞれを半角数字に自動変換したいとおもっています。
回答を見る
  • ベストアンサー

PHP 全角・半角・英数字 エラー判定

PHPを独学で勉強しているものです、あるサイトを構築中で、入力内容のエラー判定をしたいのですが、どうしても半角英字がエラーではじかれず、どなたかご指導いただけますでしょうか。 PHPのバージョンは5.2で、DBはMySQLでユーザーがある情報を登録できるサイトで、データ型にあわせるため、1以上の半角数字のみ受け付けるようにしたいです。 入力欄は3か所で、$ic0、$ic1、$ic2に格納されています。 入力が全角数字の場合はそれぞれを半角数字に自動変換したいとおもっています。 自作したものは下記の通りです。 宜しくお願い致します。 /*エラー判定*/ $ic_check=$ic0.$ic1.$ic2; if(preg_match("/^[0-9]+$/", $ic_check)){ if($ic0=="0" || $ic1=="0" || $ic2=="0"){ $error_msg="1以上の数字を入れてください。"; }else{ $error_msg=""; } } elseif(preg_match("/^[0-90-9]+$/",$ic_check)){ $ic0=mb_convert_kana($ic0, "n", "Shift_jis"); $ic1=mb_convert_kana($ic1, "n", "Shift_jis"); $ic2=mb_convert_kana($ic2, "n", "Shift_jis"); if($ic0=="0" || $ic1=="0" || $ic2=="0"){ $error_msg="1以上の数字を入れてください。"; }else{ $error_msg=""; } } elseif(preg_match("/^[a-zA-Z]+$/",$ic_check)){ $error_msg="半角数字で入力してください"; } else{ $error_msg="半角数字で入力してください"; }

  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.2

まず1点。Shift_JISをやめてUTF-8(BOM無し推奨)にしましょう。 【UTF-8を使うメリット】 ・UTF-8には接頭符号が用いられているので、マルチバイト非対応の関数でもマルチバイト文字列をそのまま扱うことが出来ます http://www.softel.co.jp/blogs/tech/archives/525 ・preg_match関数での文字クラスに関して、UTF-8であればu修飾子を使うだけで「バイト単位」ではなく「文字単位」で扱うことが出来ます。 【1以上を表す半角数字のみかどうか判定するif文】 今回は正規表現を使うまでも無いです。 http://php.net/manual/ja/function.ctype-digit.php $str = mb_convert_kana($str, 'n', 'UTF-8'); if (!ctype_digit($str) || !$str) { echo "1以上の数字で入力してください。"; } else { echo "OK"; } なお、ctype_digit関数のシグネチャをマニュアルで見ると第1引数$textは文字列でなければならないと書かれていますが、他の一般的な関数とは異なり、例外的にctype_***関数は文字列以外(配列など)を渡したときにもエラーを一切出さずにそのままFALSEを返してくれます。

buttero
質問者

お礼

ご親切に解説いただいたおかげさまでで解決できました。 ありがとうございます。ctype_digitは知識として得る事ができましたが、いまのところ、|| !$str の部分の意味がまだ理解できていないので、調べてみたいと思います。 いままで全てShift_JISでやってきましたので、UTF-8にかえるのは単純にプログラム内だけ置換すればよいのか、MySQLでつくったDBやPHPの環境まで全て統一しなくてはならないのかわかりませんが、それは別で質問することにいたします。(調べてから)

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

文字列の比較に==演算子(半角イコール2つ)を使うのは論外 ほんとに"0"と比較するなら===(半角イコール3つ)を使うこと また数字以外をはじくのであれば数字のチェックだけすれば十分 preg_match("/^[a-zA-Z]+$/",$ic_check) のような処理は不要(a-z以外の全ての文字がエラーになるべきなので)

buttero
質問者

お礼

文字列の比較に==演算子(半角イコール2つ)はなぜいけないのでしょうか?プログラミングの学校でもらったテキストにはif文の練習で、 if( $weather=="雨") { echo "家の掃除をする"; } とか書いてあり、そのまま覚えて今に至ります。 また、===と3つ使うケースがあることもはじめて知りましたので勉強してみたいと思います。 教えていただき、ありがとうございます。

関連するQ&A

  • 半角英数字のみの入力にエラーを返すには

    運営しているサイトに設置したコメントフォームからスパムがたくさん送信されてきます。 その対策として、「氏名のよみがな」入力欄が半角英数字のみの入力の場合にはアラートを出して投稿できないようにしたいです。 下記のようなJSを使用していますが、 if (!kana) { alert('氏名のよみがなを入力してください。'); return false; } の部分を変更して「半角英数字しか入力されていない場合、アラートを返す」ようにするには、どうしたら良いでしょうか? htmlの文字コードはShift_JISです。 よろしくお願いします。 function postComment { var name = eval('document.name.value'); var kana = eval('document.kana.value'); var email = eval('document.email.value'); var comment = eval('document.comment.value'); sum++; if (!name) { alert('氏名を入力してください。'); return false; } else { if (!kana) { alert('氏名のよみがなを入力してください。'); return false; } else { if (!email) { alert('メールアドレスを入力してください。'); return false; } else { if (!comment) { alert('コメントを入力してください。'); return false; } else { var confirm_text = '以下の内容で送信します\n' + 氏名:' + name + '\n よみがな:' + kana + '\n メール:' + email + '\n 本文:' + comment; if (!confirm(confirm_text)) { return false; } else { alert('コメントを送信しました。'); } } } } } }

  • preg_match関数で4-16桁の英数字かどうかをチェックしたい

    こんにちは☆ PHPでログインIDの入力フォームを作成していて、ユーザーの入力した文字が半角英数字のみで4桁以上16桁以内であるかどうかをpreg_match関数を用いてパターンチェックしたいのですが、うまくいきません。 (全角かな等が入っていてもtrueが返ってしまう。) どなたかご存知でしたらご指摘下さいm(_ _)m -------------------現在までの状況------------------------------- $login_id = $_POST["POSTされたユーザ入力"]; $login_id = mb_convert_kana($login_id, "a"); if (!preg_match("/[a-zA-Z0-9]{4,16}/", $login_id)) { echo "エラーメッセージ"; } ----------------------------------------------------------------

    • ベストアンサー
    • PHP
  • 【PHP】半角「\」を全角「¥」に変換したい(2)

    同じ過去の質問を見つけたのですが、実行してみたところできなかったので相談させてください。【過去質問】:http://oshiete1.goo.ne.jp/qa3065958.html PHP Version 4.4.6、文字コードはshift-JISです。 アンケートフォームで入力された値を受け取り、半角「\」があれば全角「¥」に置換したいのですが、上手くいきません。 試したのは下記の方法です。 [1]  $str = preg_replace("\\", "¥", $str); [2]  $str = mb_ereg_replace("\\\\", '¥', $str); [3]  $str = preg_replace("/\\\\/", '¥', $str); 同じ質問をされている方は文字コードが「UTF-8」で上記の[2][3]で上手くいっているようなので、文字コードを変更すればいいのかもしれませんが、現在あるフォームを修正しているので、できればshift-JISでしたい・・・と模索中です。 また、サイトの性質上「○○円の~」というようなメッセージが多いので、¥を削除することはできるだけ避けたいです。 ご指導をお願いいたします。

    • ベストアンサー
    • PHP
  • 【PHP】ereg() で文字種判定するときエラーになる

    PHP5使用者です。 ereg() でよくわからないエラーに直面して悩んでおります。 例えば、サンプル文字列が半角数字a~z又は -(ハイフン)のみで構成されているか調べたい場合、以下の方法を試しました。 1)if( ereg("^[\-a-z]+$", $str )){ 2)if( ereg("^[a-z-]+$", $str )){ 3)if( mb_ereg("^[\-a-z]+$", $str )){ 4)if( preg_match("/^[\-a-z]+$/", $str )){ 但し $str はシングルバイト文字です 結果、1)のみエラーになります。-をエスケープしているのになぜでしょうか? 文字コードはShift_JIS、EUC-JP、UTF-8とも試しましたが同じでした。そもそも常にマルチバイト関数を使うべきとか…? 解説していただける方、よろしくお願いいたします。

    • 締切済み
    • PHP
  • phpで全角英数字を半角英数字に変換したいんですが、できません。

    入力フォーム(html) <input type="text" name="update_content" size="80"> 内で「販売価格を100円引き」などと全角で記入し、 postで確認画面に送ります。 確認画面で <?php $rec_ymd = $_POST["update_content"]; ?> <input type="hidden" name="update_content" value="<?php $update_content ?>"> <?php print $rec_ymd ?> で表示させてからinsert.phpで 全角を半角に直してからINSERTしたいんですが、どのようにしたらいいのでしょうか。 insert.php $update_content = mb_convert_kana($update_content,"n"); $sql='INSERT INTO TEST (update_content) VALUES ("'.$update_content.'"); mysql_query($sql); としても echo $update_content; で表示させようとしたら変換どころか値すら入ってない状態です。 PHP5.1.6です。よろしくお願いします。

    • 締切済み
    • PHP
  • 全角を半角にして、整数か小数か調べて最後の0を削除

    全角の数字が含まれた文字列を整数か小数かを判別して、 最後の余分な0を非表示にしたいです。 結果をこのようにさせたいです。 980.01 ←小数 3213.12 ←小数 3222.0003 ←小数 1000.2001 ←小数 2314 ←整数 1200.98 ←小数 2980 ←整数 2313.12 ←小数 3222.0003 ←小数 800 ←整数 4500 ←整数 <?php $ary = array( '980.0100', '3213.1200', '3222.0003', '1000.2001', '2314.0000', '1200.9800', '2980.0000', '2313.1200', '3222.0003', '0800.0000', '4500.0000' ); $count = count($ary); for($i=0; $i<$count; $i++){ $inputData = $ary[$i]; $hankaku = mb_convert_kana($inputData,'n',"utf-8"); if(!preg_match('/^0$|^-?[1-9][0-9]*$/', $hankaku)) { echo $hankaku.' ←小数'.'<br>'; } else { echo $hankaku.' ←整数'.'<br>'; } } ?>

    • ベストアンサー
    • PHP
  • 半角カナ→全角カナの変換でエラー

    「mb_convert_kana」で半角カナ→全角カナの変換を行なう処理の部分で エラーが発生します。 処理部分とエラーの内容を以下に記載します。 処理: $title = mb_convert_kana($title,"KV",mb_detect_encoding($title)); エラー内容: Warning: mb_convert_kana(): Unknown encoding "" in~ 他の人が作った関数で、今までは正常に動作していたとの事なので、 何が原因なのかよく分かりません。 どなたか、解決方法よろしくお願いします。

    • 締切済み
    • PHP
  • PHPでの全角、半角判断について

    PHP5にて、入力フォムから入力された文字を全角か半角か判断しています。 半角だとフラグを立ててエラーにしております。 しかし、「ソ」だけ全角で入力しても 半角と判断されてしまい困っております。 0x5c と関係していると思うのですが 対処方法がわかりません。 ご教示頂けると助かります。 //名前(性)フリガナ if($_POST['name3'] == ""){ echo "【名前(性)フリガナ】が未入力です。<BR>"; $errflg = 1; } $len = strlen($_POST['name3']); $mblen = mb_strlen($_POST['name3'], "Shift_JIS") * 2; if($len != $mblen){ $errflg = 1; } 以上、宜しくお願いいたします。

    • 締切済み
    • PHP
  • 文字列から英数字の判別

    PHP で質問です word1変数内に英数字がある場合以外はテキスト(変数名kana1) への入力必須をのエラーをだしたいのですが、うまくいきません。 基本動くのですが、カタカナのチ以降の文字を入れると通ってしまいます。 何かいけないでしょうか? if ($kana1=="") { if(preg_match("/[a-z0-9]+/",$word1)) {}else{ echo "<h2 class="subtitle">ふりがなを入力してください。</h2><br />"; $err_flg = "1"; } }

    • ベストアンサー
    • PHP
  • 正規表現

    質問させていただきます。 文字コード「Shift-JIS」で渡ってきた文字列を 英字とスペースはOKで、 それ以外の文字列が入力されていたら、エラーいう処理を しているのですが、うまくいきません。 ご教授よろしくお願いします。 // 半角にする $kana = mb_convert_kana($_POST['kana'], "r"); if ((ereg("^[a-zA-Z]+$", trim($kana))) == false) {   echo "エラーです"; } 全角スペースと半角スペースと英字はOKで、それ以外はNG としたいです。 よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう