[JavaScript]で半角全角変換のための mb_convert_kanaっぽい関数を書いた

スマートでもなんでもない素人プログラムだけど、書いたのでメモしておく

[2011/8/25] o, O オプションを追加しました。あと、ちょっとだけ高速化。

/**
 * PHPの mb_convert_kana() っぽいもの
 * mMオプションで記号 /[!#-&(-/:-@[\]^_{|}]/ を変換
 * PHPにおける a または A オプションは rnm または RNM オプションとほぼ等価
 * (バッククオーテーションを変換しない点がPHPと異なる)
 * PHPとは違い、hc または kC の組み合わせのオプションにおいて、c または C オプションを無視しない
 * PHPと同様に動かしたいときは上記の組み合わせのオプションを指定しない or このスクリプトをテキトーに弄る
 *
 * @param string str
 * @param string option デフォルトは KV
 * r : 「全角」英字を「半角」に変換
 * R : 「半角」英字を「全角」に変換
 * n : 「全角」数字を「半角」に変換
 * N : 「半角」数字を「全角」に変換
 * m : 「全角」記号を「半角」に変換
 * M : 「半角」記号を「全角」に変換
 * s : 「全角」スペースを「半角」
 * S : 「半角」スペースを「全角」
 * k : 「全角カタカナ」を「半角カタカナ」に変換
 * K : 「半角カタカナ」を「全角カタカナ」に変換
 * h : 「全角ひらがな」を「半角カタカナ」に変換
 * H : 「半角カタカナ」を「全角ひらがな」に変換
 * c : 「全角カタカナ」を「全角ひらがな」に変換
 * C : 「全角ひらがな」を「全角カタカナ」に変換
 * V : 濁点付きの文字を一文字に変換。"K", "H" と共に使用

 * o : [2011/8/25追加] ”“’‘`¥ を ""''`\に変換
 * O : [2011/8/25追加] "'`\ を ”’`¥ に変換
 */
var mb_convert_kana = function( str, option )
{
  if( option === '' || option === undefined || option === null )
  {
    // デフォルトのオプション
    option = 'KV';
  }

  // 1文字用の正規表現
  var re = '[';

  // 2文字(濁点との組み合わせ)用の正規表現
  var re_v = '(?:';

  // 変換用の配列
  var list = {};

  // list に配列をマージする
  var m = function( o )
  {
    for( var k in o )
    {
      list[k] = o[k];
    }
  }

  if( option.indexOf('r') !== -1 && str.search(/[a-zA-Z]/) !== -1 )
  {
    m( {'a':'a','b':'b','c':'c','d':'d','e':'e','f':'f','g':'g','h':'h','i':'i','j':'j','k':'k','l':'l','m':'m','n':'n','o':'o','p':'p','q':'q','r':'r','s':'s','t':'t','u':'u','v':'v','w':'w','x':'x','y':'y','z':'z','A':'A','B':'B','C':'C','D':'D','E':'E','F':'F','G':'G','H':'H','I':'I','J':'J','K':'K','L':'L','M':'M','N':'N','O':'O','P':'P','Q':'Q','R':'R','S':'S','T':'T','U':'U','V':'V','W':'W','X':'X','Y':'Y','Z':'Z'} );
    re += 'a-zA-Z';
  }

  if( option.indexOf('R') !== -1 && str.search(/[a-zA-Z]/) !== -1 )
  {
    m( {'a':'a','b':'b','c':'c','d':'d','e':'e','f':'f','g':'g','h':'h','i':'i','j':'j','k':'k','l':'l','m':'m','n':'n','o':'o','p':'p','q':'q','r':'r','s':'s','t':'t','u':'u','v':'v','w':'w','x':'x','y':'y','z':'z','A':'A','B':'B','C':'C','D':'D','E':'E','F':'F','G':'G','H':'H','I':'I','J':'J','K':'K','L':'L','M':'M','N':'N','O':'O','P':'P','Q':'Q','R':'R','S':'S','T':'T','U':'U','V':'V','W':'W','X':'X','Y':'Y','Z':'Z'} );
    re += 'a-zA-Z';
  }

  if( option.indexOf('n') !== -1 && str.search(/[0-9]/) !== -1 )
  {
    m( {'0':'0','1':'1','2':'2','3':'3','4':'4','5':'5','6':'6','7':'7','8':'8','9':'9'} );
    re += '0-9';
  }

  if( option.indexOf('N') !== -1 && str.search(/\d/) !== -1 )
  {
    m( {'0':'0','1':'1','2':'2','3':'3','4':'4','5':'5','6':'6','7':'7','8':'8','9':'9'} );
    re += '\\d';
  }

  if( option.indexOf('s') !== -1 && str.indexOf(' ') !== -1 )
  {
    m( {' ':' '} );
    re += ' ';
  }

  if( option.indexOf('S') !== -1 && str.indexOf(' ') !== -1 )
  {
    m( {' ':' '} );
    re += ' ';
  }

  if( option.indexOf('m') !== -1 && str.search(/[!#$%&()*+,-./:;<=>?@[]^_{|}]/) !== -1 )
  {
    m( {'!':'!','#':'#','$':'$','%':'%','&':'&','(':'(',')':')','*':'*','+':'+',',':',','-':'-','.':'.','/':'/',':':':',';':';','<':'<','=':'=','>':'>','?':'?','@':'@','[':'[',']':']','^':'^','_':'_','{':'{','|':'|','}':'}'} );
    re += '!#$%&()*+,-./:;<=>?@[]^_{|}';
  }

  if( option.indexOf('M') !== -1 && str.search(/[!#-&(-/:-@[\]^_{|}]/) !== -1 )
  {
    m( {'!':'!','#':'#','$':'$','%':'%','&':'&','(':'(',')':')','*':'*','+':'+',',':',','-':'-','.':'.','/':'/',':':':',';':';','<':'<','=':'=','>':'>','?':'?','@':'@','[':'[',']':']','^':'^','_':'_','{':'{','|':'|','}':'}'} );
    re += '!#-&(-/:-@[\\]^_{|}';
  }

  if( option.indexOf('o') !== -1 && str.search(/[”“’‘`¥]/) !== -1 )
  {
    m( {'”':'"','“':'"','’':"'",'‘':"'",'`':'`','¥':'\\'} );
    re += '”“’‘`¥';
  }

  if( option.indexOf('O') !== -1 && str.search(/["'`\\]/) !== -1 )
  {
    m( {'"':'”',"'":'’','`':'`','\\':'¥'} );
    re += '"\\\'`\\\\';
  }

  if( option.indexOf('k') !== -1 && str.search(/[、。「」゛゜ァ-ヴ・ー]/) !== -1 )
  {
    m( {
      'ガ':'ガ','ギ':'ギ','グ':'グ','ゲ':'ゲ','ゴ':'ゴ','ザ':'ザ','ジ':'ジ','ズ':'ズ','ゼ':'ゼ','ゾ':'ゾ','ダ':'ダ','ヂ':'ヂ','ヅ':'ヅ','デ':'デ','ド':'ド','バ':'バ','パ':'パ','ビ':'ビ','ピ':'ピ','ブ':'ブ','プ':'プ','ベ':'ベ','ペ':'ペ','ボ':'ボ','ポ':'ポ','ヴ':'ヴ',
      '。':'。','「':'「','」':'」','、':'、','・':'・','ヲ':'ヲ','ァ':'ァ','ィ':'ィ','ゥ':'ゥ','ェ':'ェ','ォ':'ォ','ャ':'ャ','ュ':'ュ','ョ':'ョ','ッ':'ッ','ー':'ー','ア':'ア','イ':'イ','ウ':'ウ','エ':'エ','オ':'オ','カ':'カ','キ':'キ','ク':'ク','ケ':'ケ','コ':'コ','サ':'サ','シ':'シ','ス':'ス','セ':'セ','ソ':'ソ','タ':'タ','チ':'チ','ツ':'ツ','テ':'テ','ト':'ト','ナ':'ナ','ニ':'ニ','ヌ':'ヌ','ネ':'ネ','ノ':'ノ','ハ':'ハ','ヒ':'ヒ','フ':'フ','ヘ':'ヘ','ホ':'ホ','マ':'マ','ミ':'ミ','ム':'ム','メ':'メ','モ':'モ','ヤ':'ヤ','ユ':'ユ','ヨ':'ヨ','ラ':'ラ','リ':'リ','ル':'ル','レ':'レ','ロ':'ロ','ワ':'ワ','ン':'ン','゜':'゚','゛':'゙','ヮ':'ワ','ヰ':'イ','ヱ':'エ'} );
    re += '、。「」゛゜ァ-ヴ・ー';
  }

  if( option.indexOf('V') !== -1 && str.search(/(?:[ウカ-トハ-ホ]゙|[ハ-ホ]゚)/) !== -1 && option.indexOf('K') !== -1 )
  {
    m( {'ガ':'ガ','ギ':'ギ','グ':'グ','ゲ':'ゲ','ゴ':'ゴ','ザ':'ザ','ジ':'ジ','ズ':'ズ','ゼ':'ゼ','ゾ':'ゾ','ダ':'ダ','ヂ':'ヂ','ヅ':'ヅ','デ':'デ','ド':'ド','バ':'バ','パ':'パ','ビ':'ビ','ピ':'ピ','ブ':'ブ','プ':'プ','ベ':'ベ','ペ':'ペ','ボ':'ボ','ポ':'ポ','ヴ':'ヴ'} );
    re_v += '[ウカ-トハ-ホ]゙|[ハ-ホ]゚|';
  }

  if( option.indexOf('K') !== -1 && str.search(/[。-゚]/) !== -1 )
  {
    m( {'。':'。','「':'「','」':'」','、':'、','・':'・','ヲ':'ヲ','ァ':'ァ','ィ':'ィ','ゥ':'ゥ','ェ':'ェ','ォ':'ォ','ャ':'ャ','ュ':'ュ','ョ':'ョ','ッ':'ッ','ー':'ー','ア':'ア','イ':'イ','ウ':'ウ','エ':'エ','オ':'オ','カ':'カ','キ':'キ','ク':'ク','ケ':'ケ','コ':'コ','サ':'サ','シ':'シ','ス':'ス','セ':'セ','ソ':'ソ','タ':'タ','チ':'チ','ツ':'ツ','テ':'テ','ト':'ト','ナ':'ナ','ニ':'ニ','ヌ':'ヌ','ネ':'ネ','ノ':'ノ','ハ':'ハ','ヒ':'ヒ','フ':'フ','ヘ':'ヘ','ホ':'ホ','マ':'マ','ミ':'ミ','ム':'ム','メ':'メ','モ':'モ','ヤ':'ヤ','ユ':'ユ','ヨ':'ヨ','ラ':'ラ','リ':'リ','ル':'ル','レ':'レ','ロ':'ロ','ワ':'ワ','ン':'ン','゚':'゜','゙':'゛'} );
    re += '。-゚';
  }

  if( option.indexOf('h') !== -1 && str.search(/[、。「」゛゜ぁ-ん・ー]/) !== -1 )
  {
    m( {
      'が':'ガ','ぎ':'ギ','ぐ':'グ','げ':'ゲ','ご':'ゴ','ざ':'ザ','じ':'ジ','ず':'ズ','ぜ':'ゼ','ぞ':'ゾ','だ':'ダ','ぢ':'ヂ','づ':'ヅ','で':'デ','ど':'ド','ば':'バ','ぱ':'パ','び':'ビ','ぴ':'ピ','ぶ':'ブ','ぷ':'プ','べ':'ベ','ぺ':'ペ','ぼ':'ボ','ぽ':'ポ',
      '。':'。','「':'「','」':'」','、':'、','・':'・','を':'ヲ','ぁ':'ァ','ぃ':'ィ','ぅ':'ゥ','ぇ':'ェ','ぉ':'ォ','ゃ':'ャ','ゅ':'ュ','ょ':'ョ','っ':'ッ','ー':'ー','あ':'ア','い':'イ','う':'ウ','え':'エ','お':'オ','か':'カ','き':'キ','く':'ク','け':'ケ','こ':'コ','さ':'サ','し':'シ','す':'ス','せ':'セ','そ':'ソ','た':'タ','ち':'チ','つ':'ツ','て':'テ','と':'ト','な':'ナ','に':'ニ','ぬ':'ヌ','ね':'ネ','の':'ノ','は':'ハ','ひ':'ヒ','ふ':'フ','へ':'ヘ','ほ':'ホ','ま':'マ','み':'ミ','む':'ム','め':'メ','も':'モ','や':'ヤ','ゆ':'ユ','よ':'ヨ','ら':'ラ','り':'リ','る':'ル','れ':'レ','ろ':'ロ','わ':'ワ','ん':'ン','゜':'゚','゛':'゙','ゎ':'ワ','ゐ':'イ','ゑ':'エ'} );
    re += '、。「」゛゜ぁ-ん・ー';
  }

  if( option.indexOf('H') !== -1 && option.indexOf('K') === -1 && option.indexOf('V') !== -1 && str.search(/(?:[カ-トハ-ホ]゙|[ハ-ホ]゚)/) !== -1 )
  {
    m( {'ガ':'が','ギ':'ぎ','グ':'ぐ','ゲ':'げ','ゴ':'ご','ザ':'ざ','ジ':'じ','ズ':'ず','ゼ':'ぜ','ゾ':'ぞ','ダ':'だ','ヂ':'ぢ','ヅ':'づ','デ':'で','ド':'ど','バ':'ば','パ':'ぱ','ビ':'び','ピ':'ぴ','ブ':'ぶ','プ':'ぷ','ベ':'べ','ペ':'ぺ','ボ':'ぼ','ポ':'ぽ'} );
    re_v += '[カ-トハ-ホ]゙|[ハ-ホ]゚|';
  }

  if( option.indexOf('H') !== -1 && option.indexOf('K') === -1 && str.search(/[。-゚]/) !== -1 )
  {
    m( {'。':'。','「':'「','」':'」','、':'、','・':'・','ヲ':'を','ァ':'ぁ','ィ':'ぃ','ゥ':'ぅ','ェ':'ぇ','ォ':'ぉ','ャ':'ゃ','ュ':'ゅ','ョ':'ょ','ッ':'っ','ー':'ー','ア':'あ','イ':'い','ウ':'う','エ':'え','オ':'お','カ':'か','キ':'き','ク':'く','ケ':'け','コ':'こ','サ':'さ','シ':'し','ス':'す','セ':'せ','ソ':'そ','タ':'た','チ':'ち','ツ':'つ','テ':'て','ト':'と','ナ':'な','ニ':'に','ヌ':'ぬ','ネ':'ね','ノ':'の','ハ':'は','ヒ':'ひ','フ':'ふ','ヘ':'へ','ホ':'ほ','マ':'ま','ミ':'み','ム':'む','メ':'め','モ':'も','ヤ':'や','ユ':'ゆ','ヨ':'よ','ラ':'ら','リ':'り','ル':'る','レ':'れ','ロ':'ろ','ワ':'わ','ン':'ん','゚':'゜','゙':'゛'} );
    re += '。-゚';
  }

  if( option.indexOf('c') !== -1 && option.indexOf('k') === -1 && str.search(/[ァ-ン]/) !== -1 )
  {

    m( {
      'ガ':'が','ギ':'ぎ','グ':'ぐ','ゲ':'げ','ゴ':'ご','ザ':'ざ','ジ':'じ','ズ':'ず','ゼ':'ぜ','ゾ':'ぞ','ダ':'だ','ヂ':'ぢ','ヅ':'づ','デ':'で','ド':'ど','バ':'ば','パ':'ぱ','ビ':'び','ピ':'ぴ','ブ':'ぶ','プ':'ぷ','ベ':'べ','ペ':'ぺ','ボ':'ぼ','ポ':'ぽ',
      'ヲ':'を','ァ':'ぁ','ィ':'ぃ','ゥ':'ぅ','ェ':'ぇ','ォ':'ぉ','ャ':'ゃ','ュ':'ゅ','ョ':'ょ','ッ':'っ','ア':'あ','イ':'い','ウ':'う','エ':'え','オ':'お','カ':'か','キ':'き','ク':'く','ケ':'け','コ':'こ','サ':'さ','シ':'し','ス':'す','セ':'せ','ソ':'そ','タ':'た','チ':'ち','ツ':'つ','テ':'て','ト':'と','ナ':'な','ニ':'に','ヌ':'ぬ','ネ':'ね','ノ':'の','ハ':'は','ヒ':'ひ','フ':'ふ','ヘ':'へ','ホ':'ほ','マ':'ま','ミ':'み','ム':'む','メ':'め','モ':'も','ヤ':'や','ユ':'ゆ','ヨ':'よ','ラ':'ら','リ':'り','ル':'る','レ':'れ','ロ':'ろ','ワ':'わ','ン':'ん','ヮ':'ゎ','ヰ':'ゐ','ヱ':'ゑ'} );
    re += 'ァ-ン';
  }

  if( option.indexOf('C') !== -1 && option.indexOf('h') === -1 && str.search(/[ぁ-ん]/) !== -1 )
  {

    m( {
      'が':'ガ','ぎ':'ギ','ぐ':'グ','げ':'ゲ','ご':'ゴ','ざ':'ザ','じ':'ジ','ず':'ズ','ぜ':'ゼ','ぞ':'ゾ','だ':'ダ','ぢ':'ヂ','づ':'ヅ','で':'デ','ど':'ド','ば':'バ','ぱ':'パ','び':'ビ','ぴ':'ピ','ぶ':'ブ','ぷ':'プ','べ':'ベ','ぺ':'ペ','ぼ':'ボ','ぽ':'ポ','を':'ヲ',
      'ぁ':'ァ','ぃ':'ィ','ぅ':'ゥ','ぇ':'ェ','ぉ':'ォ','ゃ':'ャ','ゅ':'ュ','ょ':'ョ','っ':'ッ','あ':'ア','い':'イ','う':'ウ','え':'エ','お':'オ','か':'カ','き':'キ','く':'ク','け':'ケ','こ':'コ','さ':'サ','し':'シ','す':'ス','せ':'セ','そ':'ソ','た':'タ','ち':'チ','つ':'ツ','て':'テ','と':'ト','な':'ナ','に':'ニ','ぬ':'ヌ','ね':'ネ','の':'ノ','は':'ハ','ひ':'ヒ','ふ':'フ','へ':'ヘ','ほ':'ホ','ま':'マ','み':'ミ','む':'ム','め':'メ','も':'モ','や':'ヤ','ゆ':'ユ','よ':'ヨ','ら':'ラ','り':'リ','る':'ル','れ':'レ','ろ':'ロ','わ':'ワ','ん':'ン','ゎ':'ヮ','ゐ':'ヰ','ゑ':'ヱ'} );
    re += 'ぁ-ん';
  }

  if( re === '[' )
  {
    return str;
  }

  re += ']';
  if( re_v === '(?:' )
  {
    re_all = new RegExp( re, 'g' );
  }
  else
  {
    re_v += '))';
    re_v = re_v.replace('|)', '');
    var re_all = '(?:';
    re_all += re_v;
    re_all += '|';
    re_all += re;
    re_all += ')';
    re_all = new RegExp( re_all, 'g' );
  }

  return str.replace( re_all, function(m){
    return list[m];
  } );
};

動かしてみる

var str = 'アいガぎ*3A ウグ@7z';
function p( option )
{
  document.write
  (
    option,
    ' | ',
    mb_convert_kana( str, option ),
    "\n"
  );
}
p('---');
p('r  ');
p('R  ');
p('n  ');
p('N  ');
p('m  ');
p('M  ');
p('rnm');
p('RNM');
p('s  ');
p('S  ');
p('k  ');
p('K  ');
p('h  ');
p('H  ');
p('c  ');
p('C  ');
p('KV ');
p('HV ');
p('hc ');
p('kC ');
p('rRnNaAsSkKhHcCV');
結果
--- | アいガぎ*3A ウグ@7z
r   | アいガぎ*3A ウグ@7z
R   | アいガぎ*3A ウグ@7z
n   | アいガぎ*3A ウグ@7z
N   | アいガぎ*3A ウグ@7z
m   | アいガぎ*3A ウグ@7z
M   | アいガぎ*3A ウグ@7z
rnm | アいガぎ*3A ウグ@7z
RNM | アいガぎ*3A ウグ@7z
s   | アいガぎ*3A ウグ@7z
S   | アいガぎ*3A ウグ@7z
k   | アいガぎ*3A ウグ@7z
K   | アいガぎ*3A ウク゛@7z
h   | アイガギ*3A ウグ@7z
H   | アいガぎ*3A うく゛@7z
c   | あいがぎ*3A ウグ@7z
C   | アイガギ*3A ウグ@7z
KV  | アいガぎ*3A ウグ@7z
HV  | アいガぎ*3A うぐ@7z
hc  | あイがギ*3A ウグ@7z
kC  | アイガギ*3A ウグ@7z
rRnNaAsSkKhHcCV | アイガギ*3A ウグ@7z
Share
関連記事