JS 校驗非法字串

declandragon 發表於 2021-08-28

前言

不可見字元被使用者輸入最終入庫,一開始以為只是沒有去字串空格,排查才發現是不可見字元,要求用 JS 對輸入字串做個校驗,記錄一下,歡迎留言。

思路

  • V1

只是為了檢查不可見字元,一開始考慮的是隻允許鍵盤上的數字、字母、符號和常用漢字,但是列舉鍵盤的符號時,發現實在是太多了,到最後也沒想到什麼好辦法。

  • V2

檢查發現中文的範圍給的範圍太小了,擴大了漢字的範圍。

  • V3

又發現使用者使用的時候提示有非法字串,但是卻找不到,於是增加了一個控制檯輸出。

上程式碼

/**
 * 特殊符號校驗方法
 * @returns {boolean}
 */
String.prototype.checkString = function () {
    let rule = [
        '[\\u4e00-\\u9fa5]',
        '[\\w\\.\\:<>/ -]',
        '[~!@【】、?,。:《》…—‘’”“]',
        '[+\\*;\\·#¥%&=\\|\\{\\}()`,?;\']',
        '[\\r\\n]',
        '[\\u3400-\\u4DB5]',
        '[\\u20000-\\u2A6D6]',
        '[\\u2A700-\\u2B734]',
        '[\\u2B740-\\u2B81D]',
        '[\\u2F00-\\u2FD5]',
        '[\\u2E80-\\u2EF3]',
        '[\\uF900-\\uFAD9]',
        '[\\u2F800-\\u2FA1D]',
        '[\\u31C0-\\u31E3]',
        '[\\uff1d]',
    ];
    if (!this.toString()) {
        return true
    }
    //本來這裡用的英文逗號分割字串,後面發現使用者也需要輸入
    //一時之間找不到好的分割符號 使用了下劃線
    let arr = this.toString().replace(/(.)(?=[^$])/g, "$1_").split("_");
    let check_result = arr.map(function (x) {
        return rule.map(o => {
            return (x.search(o) === 0);
        });
    });

    let result = check_result.map(function (currentValue) {
        return currentValue.some(function (item) {
            return item === true;
        });
    });
    if (result.includes(false)) {
        for (var ident in result){
            if(result[ident] === false){
                console.log(arr[ident])
            }
        }
        return false;
    }
    return true;
};

使用

let input_str = $('#input_str').val();
if (!input_str.checkString()) {
    console.log('存在非法字元');
}

後記

JS校驗非法字串

這是一篇 10 個月前的文章,想寫的更好一點,但是發現寫不出花了,釋出得了吧,如果有更好的方法,歡迎留言 :stuck_out_tongue_winking_eye:

本作品採用《CC 協議》,轉載必須註明作者和本文連結
感謝閱讀,有收穫的話不妨點個贊:smiling_imp: