jQuery:检查字符串中是否存在特殊字符

39

我知道这个问题在 Stack 上经常被问到,但我似乎无法从已发布的问题中获得直接的答案。

我需要检查一个字符串中是否包含所有特殊字符(除了 - ),如果是,则向用户发出警告。

目前我有以下代码:

if($('#Search').val().indexOf('@') == -1 || $('#Search').val().indexOf('#') == -1 || $('#Search').val().indexOf('$') == -1 || $('#Search').val().indexOf('%') == -1 || $('#Search').val().indexOf('^') == -1 || $('#Search').val().indexOf('&') == -1 || $('#Search').val().indexOf('*') == -1 || $('#Search').val().indexOf('(') == -1 || $('#Search').val().indexOf(')') == -1 || $('#Search').val().indexOf('_') == -1 || $('#Search').val().indexOf('\'') == -1 || $('#Search').val().indexOf('\"') == -1 || $('#Search').val().indexOf('\\') == -1 || $('#Search').val().indexOf('|') == -1 || $('#Search').val().indexOf('?') == -1 || $('#Search').val().indexOf('/') == -1 || $('#Search').val().indexOf(':') == -1 || $('#Search').val().indexOf(';') == -1 || $('#Search').val().indexOf('!') == -1 || $('#Search').val().indexOf('~') == -1 || $('#Search').val().indexOf('`') == -1 || $('#Search').val().indexOf(',') == -1 || $('#Search').val().indexOf('.') == -1 || $('#Search').val().indexOf('<') == -1 || $('#Search').val().indexOf('>') == -1 || $('#Search').val().indexOf('{') == -1 || $('#Search').val().indexOf('}') == -1 || $('#Search').val().indexOf('[') == -1 || $('#Search').val().indexOf(']') == -1 || $('#Search').val().indexOf('+') == -1 || $('#Search').val().indexOf('=') == -1)
{
   // Code that needs to execute when none of the above is in the string
}
else
{
  alert('Your search string contains illegal characters.');
}

但是这似乎没有起作用。有人能帮我解决这个问题吗?


2
你需要在这里使用正则表达式,而不是无数个单独的条件。而且你一定要说清楚它究竟“为什么似乎不起作用”。 - Jon
这可能会对你有所帮助:http://stackoverflow.com/questions/10505772/checking-for-any-occurrence-of-special-characters-with-jquery - Hkachhia
4个回答

99
如果您真的想检查所有这些特殊字符,使用正则表达式会更容易:
var str = $('#Search').val();
if(/^[a-zA-Z0-9- ]*$/.test(str) == false) {
    alert('Your search string contains illegal characters.');
}

以上规定仅允许完全由 a-zA-Z0-9、连字符和空格组成的字符串。包含任何其他字符的字符串将导致 alert


新增了一个简短的解释。不过它的缺点是不能允许像 éñ 这样的国际字符,但如果您不需要允许它们,我认为这是一个好选择。 - bfavaretto
它运作正常,即使有国际字符的存在;) 再次感谢! - Guido Visser
2
这对于国际字符(中文、阿拉伯语等)无法正常工作。我不会使用它。它不会查找像安东的示例那样的特殊字符。 - Marvin Saldinger
@Stallman 意思不同。在括号内,^ 反转了列表而不是定义字符串的开头。 - bfavaretto
@bfavaretto 如果像☺■☻♣♦♠☼♫♪↕§这样的字符出现在我复制的文本中,而我想在粘贴到文本字段时进行验证,该怎么办? - tvshajeer
显示剩余2条评论

23
var specialChars = "<>@!#$%^&*()_+[]{}?:;|'\"\\,./~`-="
var check = function(string){
    for(i = 0; i < specialChars.length;i++){
        if(string.indexOf(specialChars[i]) > -1){
            return true
        }
    }
    return false;
}

if(check($('#Search').val()) == false){
    // Code that needs to execute when none of the above is in the string
}else{
    alert('Your search string contains illegal characters.');
}

6
您还可以使用白名单方法 -
var str = $('#Search').val();
var regex = /[^\w\s]/gi;

if(regex.test(str) == true) {
    alert('Your search string contains illegal characters.');
}

在这个例子中,正则表达式是数字、单词字符、下划线 (\w) 和空格 (\s)。插入符号 (^) 表示我们要查找不符合正则表达式的所有内容,因此查找不是单词字符、下划线、数字和空格的内容。

4
这种方法无法处理国际字符(如汉字、阿拉伯文等),我不建议使用。 - Marvin Saldinger
== true?难道 if(regex.test(str)) { [...] } 不够吗? - scniro
当然可以,@scniro。我只是为了清晰起见把整个方程式都放上来了。 - Jay Blanchard

2
您正在检查字符串是否包含所有非法字符。将||更改为&&

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接