【JavaScript】フォーム送信時に全角スペースを半角スペースに変換する方法

フォームの入力に全角スペースが混ざると、検索のヒット漏れやデータの不揃いの原因になります。送信時に全角スペースを半角スペースに変換しておくと、入力データを正規化できます。

この記事の結論:フォームの submit イベントで、入力値に replace(/ /g, " ") を適用します。複数の入力欄はループでまとめて変換。英数字も含めて全角→半角にしたいなら normalize("NFKC") が便利です。
スポンサーリンク

基本:送信時に全角スペースを半角に変換

フォームの submit イベントで、対象の入力欄の値に対してreplace(/ /g, " ") を実行します。正規表現の   は全角スペース(U+3000)です。

HTML:フォーム
<form id="myForm" action="submit.php" method="post">
  <input type="text" name="keyword" placeholder="キーワード">
  <button type="submit">送信</button>
</form>
JavaScript:送信時に変換
const form = document.getElementById("myForm");

form.addEventListener("submit", () => {
  const input = form.querySelector('input[name="keyword"]');
  // 全角スペース( )を半角スペースに置換
  input.value = input.value.replace(/ /g, " ");
  // このまま送信が続行される
});

すべての入力欄をまとめて変換する

入力欄が複数あるフォームでは、1つずつ書くのは大変です。querySelectorAll で対象をまとめて取得し、ループで一括変換します。

JavaScript:全テキスト欄を一括変換
form.addEventListener("submit", () => {
  // テキスト系の入力欄とテキストエリアをまとめて取得
  const fields = form.querySelectorAll('input[type="text"], textarea');

  fields.forEach((field) => {
    field.value = field.value.replace(/ /g, " ");
  });
});

複数要素の取得・ループはquerySelectorAllで取得した複数要素を操作する方法も参考になります。

英数字も含めてまとめて正規化(normalize NFKC)

「全角の英数字(A12)も半角にしたい」場合は、normalize("NFKC") が便利です。全角スペースも半角スペースに変換されるため、これ1つで広く正規化できます。

JavaScript:NFKCで一括正規化
const s = "A B 123";

console.log(s.replace(/ /g, " ")); // "A B 123"(スペースのみ半角)
console.log(s.normalize("NFKC"));   // "A B 123"(英数字も半角に)
NFKCは変換範囲が広い:normalize("NFKC") は全角英数字・全角スペースだけでなく、半角カナ→全角カナや一部の記号も変換します。「スペースだけ」を変えたいなら replace(/ /g, " ")、「全角英数字も含めて広く正規化」したいなら normalize("NFKC") と使い分けましょう。全角→半角の詳しい変換は全角を半角に変換する方法で解説しています。

動くデモ:replace と NFKC を見比べる

↓ 入力欄に全角まじりの文字を入力(または貼り付け)すると、2つの変換結果がその場で表示されます(空白が分かるよう引用符付きで表示):

replace(/ /g, " ")

normalize("NFKC")

replace全角スペースだけ半角になり、NFKC全角英数字も半角になるのが一目で分かります。用途に合わせて選びましょう。

入力中にリアルタイム変換する(IME注意)

送信時ではなく入力中に変換したい場合は input イベントを使います。ただし日本語入力(IME)の変換中に書き換えると誤動作するため、変換が確定する compositionend のタイミングで処理するのが安全です。

JavaScript:IMEに配慮したリアルタイム変換
const input = form.querySelector('input[name="keyword"]');
let composing = false;

input.addEventListener("compositionstart", () => { composing = true; });
input.addEventListener("compositionend", () => {
  composing = false;
  input.value = input.value.replace(/ /g, " "); // 確定後に変換
});
input.addEventListener("input", () => {
  if (composing) return; // IME変換中は触らない
  input.value = input.value.replace(/ /g, " ");
});

入力のリアルタイム監視はフォーム入力をリアルタイムで監視する方法で詳しく解説しています。

実務での注意点

リアルタイム変換はキャレット位置に注意:入力のたびに input.value を書き換えると、カーソル(キャレット)が末尾に飛ぶことがあり、入力中だと操作しにくくなります。全角スペースの置換は送信時(submit)や入力欄から離れたとき(blur)にまとめて行う方が、入力の邪魔になりません。
サーバー側でも正規化を:JavaScriptでの変換はあくまで入力体験(UX)の補助です。JSが無効な環境やAPIへの直接送信では効きません。確実にデータを正規化したいなら、サーバー側でも全角スペースの変換・trim を行いましょう(クライアントとサーバーの両方で正規化するのが安全です)。

よくある質問(FAQ)

Qフォーム送信時に全角スペースを半角に変換するには?
Asubmit イベントで各入力値に replace(/ /g, " ") を適用します。全角英数字も含めて変換したい場合は normalize("NFKC") や変換テーブルを使います。
Q入力中にリアルタイムで変換するには?
Ainput イベントで値を取得して変換し、フィールドに戻します。ただしIME変換中は誤動作するため、compositionend(変換確定)のタイミングで処理するのが安全です。
Qreplaceとnormalize(“NFKC”)はどちらを使う?
Aスペースだけ変えたいなら replace(/ /g, " ")全角英数字も含めて広く正規化したいなら normalize("NFKC") です。NFKCは半角カナを全角にするなど変換範囲が広い点に注意します。
Q前後の余分なスペースも消すには?
Avalue.replace(/ /g, " ").trim() で前後の空白を除去できます。連続する空白を1つにまとめるなら .replace(/\s+/g, " ") も併用します。

まとめ

フォーム送信時の全角スペース変換は、submit イベントでvalue.replace(/ /g, " ") を実行するのが基本です。入力欄が複数あるなら querySelectorAllforEach でまとめて変換します。

全角英数字も含めて広く正規化したいなら normalize("NFKC") が便利です(変換範囲が広い点に注意)。入力中に変換するなら、IMEに配慮してcompositionend のタイミングで処理しましょう。