stringFilter.js

stringFilter.jsはJavaScriptの「String.prototype」を拡張し、複数のフィルタリングをかけることの出来る関数です。
内蔵フィルターに無いものは適宜追加することができます。

概要

stringFilter.jsについて

特徴

  • 複数フィルターの順次適用
  • 内蔵フィルターに無いものは適宜追加可能
  • 元の文字列を変更しない
バグや改善項目がありましたら、GitHubのissueにあげてもらえると助かります。

はじめ方

ファイルの読み込み・適用

ファイルの読み込み

<script src="js/stringFilter.js"></script>

独自フィルターの追加

// 追加したいフィルターオブジェクト
var filter = {
    a: function(str){
        // 引数「str」は自動で付与される変換する文字列
        // ここに「str」に対するフィルタリング処理

        // 「return str;」は必須
        return str;
    },
    b: function(str, c, d){
        // 引数「str」は自動で付与される変換する文字列
        // 引数を取りたい時は「str」以降に記述
        // ここに「str」に対するフィルタリング処理

        // 「return str;」は必須
        return str;
    }
};

// フィルターを追加
String.prototype._f('addFilter', filter);

文字列にフィルターの適用(単独版・引数なし)

文字列にフィルターの適用(単独版・引数あり)

文字列にフィルターの適用(複数版・引数なし)

文字列にフィルターの適用(複数版・引数あり)

内蔵フィルター

入力制限系(必要の無い文字は削除する)

フィルター名 引数 説明
removeCtl num 引数:num{Number} タブをスペースに展開する際の文字数(デフォルト4)

タブ文字をnum数のスペースに変換後、改行以外の制御文字を削除
removeNl なし 改行を削除
trim multipleLines, useBlankLine 引数:multipleLines{Boolean} 複数行の際に各行でトリムするかどうか(trueの時に各行でトリム)
引数:useBlankLine{Boolean} 複数行で各行トリムの際に空白行を削除するかどうか(falseの時に空行削除)

全角スペースを含めたトリム
rtrim multipleLines, useBlankLine 引数:multipleLines{Boolean} 複数行の際に各行でトリムするかどうか(trueの時に各行でトリム)
引数:useBlankLine{Boolean} 複数行で各行トリムの際に空白行を削除するかどうか(falseの時に空行削除)

全角スペースを含めた右側のみのトリム
ltrim multipleLines, useBlankLine 引数:multipleLines{Boolean} 複数行の際に各行でトリムするかどうか(trueの時に各行でトリム)
引数:useBlankLine{Boolean} 複数行で各行トリムの際に空白行を削除するかどうか(falseの時に空行削除)

全角スペースを含めた左側のみのトリム
alpha なし 英字のみ(全角半角変換あり)
num なし 数字のみ(全角半角変換あり)
alphaNum なし 英数字のみ(全角半角変換あり)
numPyphen なし 数字とハイフンのみ(全角半角変換あり)
numSlash なし 数字とスラッシュのみ(全角半角変換あり)
numColon なし 数字とコロンのみ(全角半角変換あり)
hiragana なし ひらがなとスペース・長音符・半角ハイフン・半角数字のみ
  • 半角の濁点・半濁点は全角に変換
  • 数字を半角に変換
  • 全角スペースを半角スペースに変換
  • 全角ハイフン、全角ダッシュ、全角マイナス記号は半角ハイフンに変換
katakana なし カタカナとスペース・長音符・半角ハイフン・半角数字のみ
  • 半角の濁点・半濁点は全角に変換
  • 数字を半角に変換
  • 全角スペースを半角スペースに変換
  • 全角ハイフン、全角ダッシュ、全角マイナス記号は半角ハイフンに変換

文字列変換系

フィルター名 引数 説明
nl2br なし 改行をBRタグに変換
br2nl なし BRタグを改行に変換(BRの大文字・小文字の区別なし)
tab2space num 引数:num{Number} スペースの文字数

タブをnum文字のスペースに変換
snake2camel upper 引数:upper{Boolean} アッパーキャメルケースにするかどうか(trueの時はアッパーキャメル[パスカルケース]に変換)

スネークケースからキャメルケースに変換
  • アンダースコア、ハイフン、半角スペースを変換
  • 先頭の区切り文字は削除
  • 変換前にある文字列中の大文字は変換されないので注意
camel2snake separator 引数:separator{String} 区切り文字(デフォルトはハイフン)

キャメルケースからスネークケースに変換
  • 先頭の連続した大文字は大文字の最後尾とそれ以外に分解される
  • 最後尾の連続した大文字はひとつのまとまりとして変換される
hira2kana opt 引数:opt{Boolean} 小文字の「ゕ」「ゖ」を変換するかどうか falseを指定した場合は変換なし

ひらがなを全角カタカナに変換
  • 以下の文字は結合してカタカナに変換
    • 「う゛」→「ヴ」
    • 「わ゛」→「ヷ」
    • 「ゐ゛」→「ヸ」
    • 「ゑ゛」→「ヹ」
    • 「を゛」→「ヺ」
    • 「ゝ゛」→「ヾ」
kana2hira opt 引数:opt{Boolean} 小文字の「ヵ」「ヶ」を変換するかどうか falseを指定した場合は変換なし

全角カタカナをひらがなに変換
  • 以下の文字を結合・展開
    • 「ウ゛」→「ゔ」
    • 「ヷ」→「わ゛」
    • 「ヸ」→「ゐ゛」
    • 「ヹ」→「ゑ゛」
    • 「ヺ」→「を゛」
    • 「ヽ゛」→「ゞ」
  • ひらがなに無いカタカナは変換しない(ひらがなに無い小文字)
    • 「ㇰ」「ㇱ」「ㇲ」「ㇳ」「ㇴ」「ㇵ」「ㇶ」「ㇷ」
    • 「ㇸ」「ㇹ」「ㇺ」「ㇻ」「ㇼ」「ㇽ」「ㇾ」「ㇿ」
hankana2zenkana なし 半角カタカナを全角カタカナに変換
  • 半角カナ領域の記号も全角に変換
    • 「。」「、」「「」「」」「・」
zen2han tilde, mark, hankana, space, alpha, num 引数:tilde{Boolean} チルダ falseを指定した場合は変換なし
引数:mark{Boolean} 記号 falseを指定した場合は変換なし
引数:hankana{Boolean} 半角カナ記号 trueを指定した場合のみ変換
引数:space{Boolean} スペース falseを指定した場合は変換なし
引数:alpha{Boolean} 英字 falseを指定した場合は変換なし
引数:num{Boolean} 数字 falseを指定した場合は変換なし

全角から半角に置き換え(カタカナは含まない)
  • 全角チルダ、全角波ダッシュ共に半角チルダに変換
  • 全角ハイフン、全角ダッシュ、全角マイナス記号は半角ハイフンに変換
  • 長音符は半角ハイフンに含めない(住所の地名等に使用される為)
han2zen tilde, mark, hankana, space, alpha, num 引数:tilde{Boolean} チルダ falseを指定した場合は変換なし
引数:mark{Boolean} 記号 falseを指定した場合は変換なし
引数:hankana{Boolean} 半角カナ記号 falseを指定した場合は変換なし
引数:space{Boolean} スペース falseを指定した場合は変換なし
引数:alpha{Boolean} 英字 falseを指定した場合は変換なし
引数:num{Boolean} 数字 falseを指定した場合は変換なし

半角から全角に置き換え(カタカナは含まない)
  • チルダは全角チルダに変換
one2multi なし 一文字で表記される文字を複数文字に展開する(主に会社名等で使用される文字)
  • 「㈱」「㈲」「㈳」「㈵」「㈶」「㈻」「㈼」「㍿」

数字処理系

フィルター名 引数 説明
toInt なし 文字列を整数にして返す(parseInt)
  • 全角の数字は半角にする
  • 全角ハイフン、全角ダッシュ、全角マイナス記号、長音符は半角ハイフンに変換
  • 先頭のマイナス以外のハイフンは削除
  • 数字以外の文字は削除
toFloat なし 文字列を浮動小数点にして返す(parseFloat)
  • 全角の数字は半角にする
  • 全角ハイフン、全角ダッシュ、全角マイナス記号、長音符は半角ハイフンに変換
  • 先頭のマイナス以外のハイフンは削除
  • 数字以外の文字は削除
numString num, format, useMinus 引数:num{Number} 小数点以下の桁数(デフォルトは0「整数」、マイナスの指定は無視)
引数:format{Boolean} 整数部分をフォーマットするかどうか(trueの時にフォーマットを実行)
引数:useMinus{Boolean} マイナスを削除するかどうか(falseの時のみマイナスを削除)

数字(文字列)に変換して返す
  • 全角の数字は半角にする
  • 全角ハイフン、全角ダッシュ、全角マイナス記号、長音符は半角ハイフンに変換
  • 先頭のマイナス以外のハイフンは削除
  • 数字以外の文字は削除
  • parseFloatを通したものを小数点以下numで切り捨て
  • NaNの時は0
  • Number.prototype.toFixed()は小数点以下を近似値で表現する為の対策版
numFormat なし 数字の桁区切り
removeFigure なし 桁区切りの数字から区切り文字の削除(「,」の削除)
padSlice num, pad 引数:num{Number} 切り出す文字数(指定なしもしくは0より小さいときは2)
引数:pad{String} 桁数に足りない場合に左側を埋める文字(デフォルトは0)

文字列を右からnum文字切り出す(num文字に足りない場合はpadで埋める)
padFill num, pad 引数:num{Number} 切り出す文字数(指定なしもしくは0より小さいときは2)
引数:pad{String} 桁数に足りない場合に左側を埋める文字(デフォルトは0)

文字列の左側を桁数numになるまで埋める(numを超える場合は何もしない)

エスケープ・サニタイズ系

フィルター名 引数 説明
escapeHTML なし HTMLエスケープ(エンティティ文字への置換え)
unEscapeHTML なし HTMLアンエスケープ(エンティティ文字からの置換え)
escapeJs なし JavaScriptエスケープ
unEscapeJs なし JavaScriptアンエスケープ
escapeJsHTML なし JavaScriptエスケープの後、HTMLエスケープ
noScript なし 外部リンク不可、括弧類のエスケープ
  • 連続したスラッシュを全角にする
  • JavaScriptで使用される括弧類を全角にする

デモ

INPUTの文字列のフィルタリング

IME入力確定時・IMEがOFFの時にキー入力でイベントが発火する 「jQuery.imeEnter」と 組み合わせて使用してみます。

/**
 * HTML部分
 */

// 小数点以下なしで桁区切りにフォーマット
<label>金額入力</label>
<input type="text" class="form-control price" data-filter='[["numString", 0, true]]'>

// 半角・全角カタカナをひらがなに変換。ひらがなとスペース・長音符・半角ハイフン・半角数字のみを入力可
<label>ふりがな</label>
<input type="text" class="form-control" data-filter='["hankana2zenkana", "kana2hira", "hiragana"]'>

// 半角カタカナを全角カタカナに変換。記号は半角に(チルダは何もしない)
<label>住所等</label>
<input type="text" class="form-control" data-filter='["hankana2zenkana", ["zen2han", false]]'>
                            
/**
 * JavaScript部分
 */

// IME入力確認の初期化
$('input[data-filter]').imeEnter();

// フォーカスを受けたとき・外れたときでIME入力確認のON・OFFを行う
// IME入力確定時・IMEがOFFの時にキー入力で発火するイベントの「enter.imeEnter」で入力のフィルタリングを行う
$(document).on('focus blur enter.imeEnter', 'input[data-filter]', function (event) {
    switch (event.type) {
        case 'focus':
            // フォーカスを受けたときに入力状態の確認を有効化
            $(this).imeEnter('on');
            break;
        case 'blur':
            // フォーカスが外れたときに入力状態の確認を無効化
            $(this).imeEnter('off');
            break;
        case 'enter':
            // IME確定時・IMEがOFFの時のキー入力時にフィルタリングの実行

            // キャレットの位置取得
            var caret = this.selectionEnd;

            // フィルターの取得
            var filter = $(this).data('filter');
            // 現在の文字列の取得
            var str = $(this).val();
            // 文字列の置換え
            var ret = str._f(filter);
            if ($(this).hasClass('price')) {
                // 金額の入力欄の時は「円」を足す
                ret += '円';
            }
            // 値のセット
            $(this).val(ret);

            // 変換後の文字列との差分からキャレット位置の変更
            caret += ret.length - str.length;

            // 金額の入力欄の時は「円」を足しているので調整
            if ($(this).hasClass('price') && caret === ret.length) {
                // キャレットの位置が最後尾の場合「円」の後ろにあるのでキャレット位置を変更する
                caret -= 1;
            }
            this.selectionStart = caret;
            this.selectionEnd = caret;
            break;
    }
});

// 「enter」を発行してinputの中の文字列を初期化しておく
$('input[data-filter]').trigger($.Event('enter'));
                            

小数点以下なしで桁区切りにフォーマット

半角・全角カタカナをひらがなに変換。ひらがなとスペース・長音符・半角ハイフン・半角数字のみを入力可

半角カタカナを全角カタカナに変換。記号は半角に(チルダは何もしない)