JavaScriptでPHPのmb_convert_kanaを再現

Pocket

PHPにはmb_convert_kanaという関数があります。英字、数字、ひらがな、カタカナの半角と全角を相互に変換することができます。ひらがなとカタカナの変換もできます。

PHP: mb_convert_kana - Manual

これをJavaScriptで再現してみました。オプションはPHPと全く同じです。
前に「JavaScriptで全角英数字を半角に変換」という記事を書きましたが、一部、これを流用しています。

function mb_convert_kana(text, option) {
  //PHPのmb_convert_kanaを再現。
  var katahan, kanazen, hirazen, mojilength, i, re;
  katahan = ["ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "デ", "ド", "バ", "パ", "ビ", "ピ", "ブ", "プ", "ベ", "ペ", "ボ", "ポ", "ヴ", "ー", "ァ", "ア", "ィ", "イ", "ゥ", "ウ", "ェ", "エ", "ォ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ッ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ャ", "ヤ", "ュ", "ユ", "ョ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヲ", "ン", "カ", "ケ", "ワ", "イ", "エ", "゙", "゚"];
  kanazen = ["ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "デ", "ド", "バ", "パ", "ビ", "ピ", "ブ", "プ", "ベ", "ペ", "ボ", "ポ", "ヴ", "ー", "ァ", "ア", "ィ", "イ", "ゥ", "ウ", "ェ", "エ", "ォ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ッ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ャ", "ヤ", "ュ", "ユ", "ョ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヲ", "ン", "ヵ", "ヶ", "ヮ", "ヰ", "ヱ", "゛", "゜"];
  hirazen = ["が", "ぎ", "ぐ", "げ", "ご", "ざ", "じ", "ず", "ぜ", "ぞ", "だ", "ぢ", "づ", "で", "ど", "ば", "ぱ", "び", "ぴ", "ぶ", "ぷ", "べ", "ぺ", "ぼ", "ぽ", "ヴ", "ー", "ぁ", "あ", "ぃ", "い", "ぅ", "う", "ぇ", "え", "ぉ", "お", "か", "き", "く", "け", "こ", "さ", "し", "す", "せ", "そ", "た", "ち", "っ", "つ", "て", "と", "な", "に", "ぬ", "ね", "の", "は", "ひ", "ふ", "へ", "ほ", "ま", "み", "む", "め", "も", "ゃ", "や", "ゅ", "ゆ", "ょ", "よ", "ら", "り", "る", "れ", "ろ", "わ", "を", "ん", "か", "け", "ゎ", "ゐ", "ゑ", "゛", "゜"];
  mojilength = katahan.length;
  //r:「全角」英字を「半角」に変換します。
  //a:「全角」英数字を「半角」に変換します。
  if(option.match(/[ra]/)) {
    text = text.replace(/[A-z]/g, function ($0) {
      return String.fromCharCode(parseInt($0.charCodeAt(0)) - 65248);
    });
  }
  //R:「半角」英字を「全角」に変換します。
  //A:「半角」英数字を「全角」に変換します
  if(option.match(/[RA]/)) {
    text = text.replace(/[A-z]/g, function ($0) {
      return String.fromCharCode(parseInt($0.charCodeAt(0)) + 65248);
    });
  }
  //n:「全角」数字を「半角」に変換します。
  //a:「全角」英数字を「半角」に変換します。
  if(option.match(/[na]/)) {
    text = text.replace(/[0-9]/g, function ($0) {
      return String.fromCharCode(parseInt($0.charCodeAt(0)) - 65248);
    });
  }
  //N:「半角」数字を「全角」に変換します。
  //A:「半角」英数字を「全角」に変換します
  if(option.match(/[NA]/)) {
    text = text.replace(/[0-9]/g, function ($0) {
      return String.fromCharCode(parseInt($0.charCodeAt(0)) + 65248);
    });
  }
  //s:「全角」スペースを「半角」に変換します。
  if(option.match(/s/)) {
    text = text.replace(/ /g, " ");
  }
  //S:「半角」スペースを「全角」に変換します。
  if(option.match(/S/)) {
    text = text.replace(/ /g, " ");
  }
  //k:「全角カタカナ」を「半角カタカナ」に変換します。
  if(option.match(/k/)) {
    for(i = 0; i < mojilength; i++) {
      re = new RegExp(kanazen[i], "g");
      text = text.replace(re, katahan[i]);
    }
  }
  //K:「半角カタカナ」を「全角カタカナ」に変換します。
  //V:濁点付きの文字を一文字に変換します。"K", "H" と共に使用します。
  if(option.match(/K/)) {
    if(!option.match(/V/)) {
      text = text.replace(/゙/g, "゛");
      text = text.replace(/゚/g, "゜");
    }
    for(i = 0; i < mojilength; i++) {
      re = new RegExp(katahan[i], "g");
      text = text.replace(re, kanazen[i]);
    }
  }
  //h:「全角ひらがな」を「半角カタカナ」に変換します。
  if(option.match(/h/)) {
    for(i = 0; i < mojilength; i++) {
      re = new RegExp(hirazen[i], "g");
      text = text.replace(re, katahan[i]);
    }
  }
  //H:「半角カタカナ」を「全角ひらがな」に変換します。
  //V:濁点付きの文字を一文字に変換します。"K", "H" と共に使用します。
  if(option.match(/H/)) {
    if(!option.match(/V/)) {
      text = text.replace(/゙/g, "゛");
      text = text.replace(/゚/g, "゜");
    }
    for(i = 0; i < mojilength; i++) {
      re = new RegExp(katahan[i], "g");
      text = text.replace(re, hirazen[i]);
    }
  }
  //c:「全角カタカナ」を「全角ひらがな」に変換します。
  if(option.match(/c/)) {
    for(i = 0; i < mojilength; i++) {
      re = new RegExp(kanazen[i], "g");
      text = text.replace(re, hirazen[i]);
    }
  }
  //C:「全角ひらがな」を「全角カタカナ」に変換します。
  if(option.match(/C/)) {
    for(i = 0; i < mojilength; i++) {
      re = new RegExp(hirazen[i], "g");
      text = text.replace(re, kanazen[i]);
    }
  }
  return text;
}

[ 2014年11月9日 | カテゴリー: JavaScript | タグ: , , ]

« | »

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

送信してください。


タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報