前言
不可見字元被使用者輸入最終入庫,一開始以為只是沒有去字串空格,排查才發現是不可見字元,要求用 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('存在非法字元');
}
後記
這是一篇 10 個月前的文章,想寫的更好一點,但是發現寫不出花了,釋出得了吧,如果有更好的方法,歡迎留言
本作品採用《CC 協議》,轉載必須註明作者和本文連結