2012-04-23 86 views
-3

正如其他人推薦的「創建白名單」,但我真的想創建一個黑名單。 這是我的代碼使用Javascript阻止某些範圍的ASCII字符REGEX

if($("#txtTag").val().length <=0 || $("#txtTag").val() =="") 
{ 
    $("#ep-insert-keyword").html("Please Enter Keyword"); 
    $("#ep-insert-keyword").fadeIn("normal"); 
} 
else if(!RegexCheck(/^[a-zA-Z\_]+$/g,$("#txtTag").val())) 
{ 
    $("#ep-insert-keyword").html("Special characters are not allowed"); 
    $("#ep-insert-keyword").fadeIn("normal"); 
} 

我想阻止我的用戶輸入我在正則表達式定義的任何特殊字符。 我想阻止字符是這個範圍的字符的ASCII

0-47 58-64 91-96 123-127

我真的想從白名單黑名單扭轉我的代碼 ...但我不知道如何。

我不擔心其他語言,我真的希望他們能夠通過我的驗證...我只是想阻止在ASCII範圍我想

+3

爲什麼要在白名單實現時更容易實現 – Hubro 2012-04-23 02:09:44

+0

我同意白名單在大多數情況下都比黑名單簡單。這裏也類似qusetion http:// stackoverflow。com/questions/756567/regular-expression-for-excluded-special-characters – 2012-04-23 02:11:04

+2

如果有人輸入'μ'或'ß'或其他數千個其他非ASCII字符會發生什麼?人們推薦白名單是有原因的。 – 2012-04-23 02:13:25

回答

2

雖然我和別人是人物並推薦白名單,這裏是你將如何使用正則表達式做一個黑名單:

// 0-47 : 00-2F : control codes, spaces, punctuation 
// 58-64 : 3A-40 : more punctuation 
// 91-96 : 5B-60 
// 123-127 : 7B-7F 

function verifyChars(str) { 
    return(str.match(/^[^\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+$/) != null); 
} 

而且這裏有一個的jsfiddle在這一堆的測試案例:http://jsfiddle.net/jfriend00/24xF7/

或者多一點EFFIC ient(因爲它僅在啓動時計算一次,正則表達式,並使用.test()):

var verifyChars = (function() { 
    var re = /^[^\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+$/; 
    return function(str) { 
     return(re.test(str)); 
    } 
})(); 

這一塊的jsfiddle測試用例:http://jsfiddle.net/jfriend00/fZ3AN/

僅供參考,這裏有一個如何把非打印字符到一個很好的參考正則表達式:http://www.regular-expressions.info/characters.html

+0

爲什麼不使用'return!/.../.test(str);',它似乎更適合。 – RobG 2012-04-23 03:33:37

+0

@RobG - 我添加了一個更高效的版本,它們都使用'.test()'並預先評估正則表達式。 – jfriend00 2012-04-23 04:08:09

0

更多評論的,其他人幾乎涵蓋爲什麼測試允許的字符,在這種情況下,可能比對測試排除的字符簡單得多:

> if($("#txtTag").val().length <=0 || $("#txtTag").val() =="") { 

推測txtTag是像輸入或textarea這樣的元素的ID。在這種情況下,該值是一個字符串,其長度永遠不能小於零。此外,空字符串「」的長度爲零,因此它是由第一個測試覆蓋,因此上述可以簡單:

if ($("#txtTag").val().length == 0) 

然後,你必須:

> else if(!RegexCheck(/^[a-zA-Z\_]+$/g,$("#txtTag").val())){ 

您的代碼會要更有效,因爲:

var re = /^[a-zA-Z\_]+$/; 
var value = $("#txtTag").val(); // or document.getElementById('txtTag').value 

if (value == '') { 
    // value is blank, do something 

) else if (!re.test(value)) { 
    // value has characters outside the restricted set 
} 

順便說一句,如果你設置爲「請輸入關鍵詞」元素的默認值,你可以這樣做:

var el = document.getElementById('txtTag'); 

if (el.value == '') { 
    // nothing has been entered 
    el.value = el.defaultValue; // reset to 'Please enter keyword" 

} else if (...) {