
通常、入力エラーチェックは JavaScript などクライアントサイドで行うことが多い。ここでは isleap.php と同様、1つのPHPプログラムの中で、入力、エラーチェック、結果出力を行う方法を紹介する。

(2025年1月3日)PHP部とHTML部を分離した.
目次
入力テキストの長さを検査するサンプル・プログラム
解凍できたら、input1.php というファイル名で Apacheの仮想ディレクトリが通っているディレクトリにセーブすること。
例によって、画面に表示している行番号は説明の便宜上のものであり、ソースプログラムには含まれていない。
サンプル・プログラムの実行方法
入力テキストの長さをチェックする仕組み
input1.php
41: <!-- HTML部 ============================================================ -->
42: <!DOCTYPE html>
43: <html lang="ja">
44: <head>
45: <meta charset="UTF-8">
46: <title>入力テキストのエラーチェック(長さ)</title>
47: </head>
48: <body>
49: <form action="input1.php" method="post">
50: <?= $msg ?>
51: <input type="text" size="20" name="text" value="<?= $text ?>">
52: <input type="submit" value="実行">
53: </form>
54: </body>
55: </html>

入力を促すメッセージ、もしくは判定結果は変数 $msg に代入しておく。
入力テキストは <form> タグの <input> で取得する。こちらは変数 $text に代入できるようにする。
input1.php
10: // メイン・プログラム =====================================================
11: $min_length = 3; // 最小長
12: $max_length = 10; // 最大長
13:
14: if (isset($_POST['text']) == FALSE) $text = ''; // 初回起動時
15: else $text = $_POST['text'];
16:
17: $l = mb_strwidth($text); // テキストの長さ
ここでは、$min_length に1を代入しているので、「何か文字を入力しなければならない」チェックも兼ねている。チェックする文字列は POST メソッドの名前textとして渡されることにするが、初回起動時はtextは渡されないので変数 $_POST["text"] は存在しない。このままではエラーになってしまうので、関数 isset を使って場合分け処理を行っている。

関数 mb_strwidth によって文字列の長さを求める。関数 mb_strwidth は、ANK文字なら1、マルチバイト文字なら2として数える。ここで、「マルチバイト文字」の定義は処理系によって異なるのだが、日本語の場合、「全角文字」が相当すると考えておけばいいだろう。
シフトJIS文字の場合は関数 strlen 関数でも同じ結果が得られるが、 UTF-8では mb_strwidth を使わないと正しい結果が得られない。
入力が正常の場合と異常の場合
input1.php
19: // 正常なら入力テキストを表示
20: if (($l >= $min_length) && ($l <= $max_length)) {
21: $msg = '入力されたテキストは => ';
22: // 未入力
23: } else if ($l <= 0) {
24: $msg = 'テキストを入力してください => ';
25: // 異常なら再入力を促す
26: } else if ($l < $min_length) {
27: $msg = 'テキストが短すぎます => ';
28: } else if ($l > $min_length) {
29: $msg = 'テキストが長すぎます => ';
30: }
異常入力の場合は、入力文字が短いのか長すぎるのか表示して、再入力を促す。初回入力時もここにジャンプする。
入力値が数字かどうかを検査するサンプル・プログラム
解凍できたら、input2.php というファイル名で Apacheの仮想ディレクトリが通っているディレクトリにセーブすること。
例によって、画面に表示している行番号は説明の便宜上のものであり、ソースプログラムには含まれていない。
サンプル・プログラムの実行方法
入力テキストが数字かどうかをチェックする仕組み
input2.php
10: // メイン・プログラム =====================================================
11: if (isset($_POST['text']) == FALSE) $text = ''; // 初回起動時
12: else $text = $_POST['text'];
13:
14: $l = mb_strwidth($text); // テキストの長さ
15: $flag = is_numeric($text); // テキストが数字かどうか
16:
17: // 正常なら入力テキストを表示
18: if ($flag == TRUE) {
19: $msg = '入力された数字は => ';
20: // 未入力
21: } else if ($l <= 0) {
22: $msg = '数字を入力して下さい => ';
23: // 異常なら再入力を促す
24: } else {
25: $msg = '数字以外の文字が入力されています => ';
26: }

関数 is_numeric は、引き数が数字かどうかを調べる。数字なら TRUE を、数字以外の文字が混ざっていれば FALSE を返す。
そこで TRUE なら正常系の処理を行い、そうでなければ再入力を促す。初回入力時もここにジャンプする。

isで始まる関数には、変数の値をチェックできるものが複数用意されている。入力チェックに使えるだろう。
半角英字で始まり、2文字目以降が半角英数字かどうかを検査するサンプル・プログラム
解凍できたら、input3.php というファイル名で Apacheの仮想ディレクトリが通っているディレクトリにセーブすること。
例によって、画面に表示している行番号は説明の便宜上のものであり、ソースプログラムには含まれていない。
サンプル・プログラムの実行方法
正規表現によるパターンマッチング
input3.php
10: // メイン・プログラム =====================================================
11: // チェックするパターン(perl互換正規表現)
12: $pattern = '/^[A-Z|a-z][0-9|A-Z|a-z]+$/u';
13:
14: if (isset($_POST['text']) == FALSE) $text = ''; // 初回起動時
15: else $text = $_POST['text'];
16:
17: $l = mb_strwidth($text); // テキストの長さ
18: $flag = preg_match($pattern, $text); // テキストが数字かどうか
19:
20: // 正常なら入力テキストを表示
21: if ($flag == TRUE) {
22: $msg = '入力されたテキストは => ';
23: // 未入力
24: } else if ($l <= 0) {
25: $msg = 'テキストを入力して下さい => ';
26: // 異常なら再入力を促す
27: } else {
28: $msg = '入力が間違っています(先頭は半角アルファベット,半角英数字のみ) => ';
29: }
しかし、入力されたテキストが「半角英字で始まり、2文字目以降が半角英数字である」かどうかを調べる組み込み関数は存在しない。このような込み入った判定を行う際に活躍するのが 正規表現 である。
PHPには POSIX および Perl 互換の正規表現を行う関数群が揃っている。「半角英字で始まり、2文字目以降が半角英数字である」をPerl互換正規表現で記述すると、

/.../ で囲んだ部分が正規表現であることを示す。

^ は文字列の先頭を示す。$ は文字列の末尾を示す。
[A-Z] は文字A~Zのいずれかとマッチするクラスで、[A-Z|a-z]は文字A~Zまたはa-zにマッチするクラスである。[0-9|A-Z|a-z] は文字0~9またはA~Zまたはa-zにマッチする。
+ は直前の文字の1回以上の繰り返しを指す。

入力テキストと正規表現のマッチングを行うのが関数 preg_match である。マッチしたら TRUE、そうでなければ FALSEを返す。
そこで、TRUE なら正常系の処理を行い、そうでなければ再入力を促す。初回入力時もここにジャンプする。

Perl互換正規表現の詳細については、https://jp2.php.net/manual/ja/ref.pcre.php をご覧いただきたい。
正規表現の応用
たとえばメールアドレスのチェックなら、「英小文字で始まり、2文字目以降は英小文字または数字、途中に@が入り、英小文字または数字、途中に.(ドット)が入り、英小文字または数字が続く」というルールにしておけば、

と記述できる。実際のメールアドレスには_(アンダーバー)などが利用できるので、もう少し工夫する必要はある(「正規表現でメールアドレスかどうかチェックする」参照)。

マルチバイト文字(全角文字)に対応するPOSIX互換正規表現マッチング関数 [mb_ereg_match] もある。これを使えば、機種依存文字でないかどうかチェックすることもできる。

正規表現の使い方については、「PHPで正規表現」で解説しているので、ご覧いただきたい。
参考サイト
- PHPセキュリティ対策:正規化した文字列を取り出す
- PHPで正規表現:ぱふぅ家のホームページ
- 入力チェックとエラー表示:PHP pro
これをバリデーション(validation)と呼ぶ。