1. ホーム
  2. HTML

【HTML】フォームの入力チェック(バリデーション)の方法|required・pattern・maxlength を解説

Share

入力フォームで「必須項目が空のまま送信された」「メールアドレスの形式が違う」といったミスを防ぎたいとき、JavaScript を書かなくても HTML の属性だけで入力チェック(バリデーション)ができます。requiredpatternminlengthmaxlength などの属性を input に付けるだけで、ブラウザが送信前に自動でチェックし、問題があればエラーメッセージを表示してくれます。この記事では、これらのバリデーション属性の使い方と、CSS でのエラー表示、つまずきやすいポイントまで、実際に動くフォームを見ながら解説します。

HTML だけでできる入力チェック

HTML には「フォームバリデーション」という仕組みが標準で備わっています。input に条件を表す属性を付けておくと、送信ボタンを押したときにブラウザが値をチェックし、条件を満たさない項目があれば送信を止めてエラーメッセージを出します。代表的な属性を一覧で見てみましょう。

属性役割
required必須項目にする(空だと送信できない)
minlength / maxlength入力できる最小・最大の文字数
min / max数値や日付の最小・最大値
pattern正規表現で入力形式を指定する
typeemail・url など形式に応じたチェック

下のフォームは、これらの属性を使った例です。空のまま、または条件に合わない値で「送信する」を押すと、ブラウザの標準エラーが表示されます。入力欄の枠の色は CSS で、条件を満たすと緑・満たさないと赤に変わるようにしています。実際に入力して動きを確かめてみてください。

<form>
  <p>
    <label>名前(必須)<br>
      <input type="text" name="name" required placeholder="必須項目です">
    </label>
  </p>
  <p>
    <label>メールアドレス<br>
      <input type="email" name="email" placeholder="name@example.com">
    </label>
  </p>
  <p>
    <label>ユーザー名(半角英数3〜10字)<br>
      <input type="text" name="user" pattern="[a-zA-Z0-9]{3,10}"
             title="半角英数字を3〜10文字で入力してください">
    </label>
  </p>
  <button type="submit">送信する</button>
</form>
form { font-family: sans-serif; max-width: 320px; }
input {
  width: 100%;
  padding: 6px 8px;
  margin-top: 4px;
  border: 2px solid #ccc;
  border-radius: 4px;
  box-sizing: border-box;
}
/* 入力内容が条件を満たさないとき赤枠に */
input:invalid { border-color: #e53935; }
/* 条件を満たすと緑枠に */
input:valid { border-color: #43a047; }
button {
  margin-top: 8px;
  padding: 8px 16px;
  border: 0;
  border-radius: 4px;
  background: #4a3aff;
  color: #fff;
  cursor: pointer;
}
Preview

required で必須項目にする

required は、その項目を必須にする属性です。値が空のまま送信しようとすると、ブラウザが「このフィールドを入力してください」といったメッセージを出して送信を止めます。属性に値は不要で、書くだけで有効になります。

form.html
<input type="text" name="name" required>

<!-- チェックボックスやセレクトにも使える -->
<input type="checkbox" name="agree" required>

文字数を制限する minlength・maxlength

maxlength入力できる最大の文字数minlength最小の文字数を指定します。maxlength はそもそも上限を超えて入力できなくなるのに対し、minlength は文字数が足りない状態で送信しようとしたときにエラーになる、という違いがあります。

form.html
<!-- 8文字以上・20文字以下のパスワード -->
<input type="password" name="pw" minlength="8" maxlength="20" required>

数値や日付の入力欄では、文字数ではなく値の大きさmin / max で制限します。たとえば type="number"min="0" max="100" を付ければ、0〜100以外の数値は送信できなくなります。

pattern で入力形式を指定する

pattern 属性には正規表現を指定し、その形式に一致する入力だけを許可します。郵便番号や電話番号、半角英数字のユーザー名など、決まったフォーマットを求めたいときに便利です。入力された値が正規表現に完全に一致する必要があります。

form.html
<!-- 郵便番号(数字3桁-数字4桁) -->
<input type="text" name="zip" pattern="\d{3}-\d{4}"
       title="123-4567 の形式で入力してください">

<!-- 半角英数字3〜10文字のユーザー名 -->
<input type="text" name="user" pattern="[a-zA-Z0-9]{3,10}">

pattern を使うときは、あわせて title 属性にどんな形式が必要かを書いておくのがおすすめです。条件に合わないときのエラーメッセージにこの説明が追加され、利用者が何を入力すべきか分かりやすくなります。

type による自動チェック

inputtype を適切に選ぶだけでも、形式チェックが効きます。type="email" なら「@ を含むメール形式か」、type="url" なら「URL の形式か」をブラウザが自動で判定します。pattern を書かなくても基本的な形式チェックができるので、まずは正しい type を選ぶことが第一歩です。

form.html
<input type="email" name="email" required>  <!-- メール形式 -->
<input type="url" name="site">               <!-- URL形式 -->
<input type="number" name="age" min="0" max="120">

CSS でエラー・正常を見せる

バリデーションの状態は、CSS の擬似クラス :invalid(条件を満たさない)と :valid(満たす)でスタイルを切り替えられます。冒頭のデモのように、入力欄の枠の色を変えると、利用者がリアルタイムで状態を把握しやすくなります。

style.css
input:invalid { border-color: #e53935; } /* 赤 */
input:valid   { border-color: #43a047; } /* 緑 */

ただし、未入力の必須項目は最初から :invalid 扱いになるため、ページを開いた直後から赤枠になってしまいます。気になる場合は、利用者が操作した後だけ色を変える :user-invalid 擬似クラスを使うか、JavaScript で送信を試みたタイミングに合わせて表示する方法もあります。

サーバー側のチェックも必要な理由

HTML のバリデーションはとても手軽ですが、これだけに頼ってはいけません。ブラウザの開発者ツールで属性を消したり、フォームを使わず直接データを送信したりすれば、チェックを簡単に回避できてしまうからです。HTML のバリデーションは「利用者の入力ミスを早く知らせて使いやすくするためのもの」と位置づけ、本当の検証は必ずサーバー側(PHP など)でも行うようにしてください。両方を組み合わせることで、使いやすさと安全性を両立できます。

まとめ

HTML のバリデーション属性を使えば、JavaScript なしで基本的な入力チェックができます。要点を整理します。

  • required で必須項目に。空のまま送信できなくなる。
  • minlength / maxlength で文字数、min / max で数値や日付の範囲を制限。
  • pattern は正規表現で形式を指定。title に説明を添えると親切。
  • type="email" など適切な type を選ぶだけでも形式チェックが効く。
  • 状態は CSS の :invalid / :valid で見せられる。
  • HTML のチェックは回避可能。検証はサーバー側でも必ず行う。

まずは required と正しい type を付けるところから始めると、少ない手間でフォームの使いやすさがぐっと上がります。形式が決まった項目には pattern を加えていきましょう。

参考ページ