2012-12-12 13 views
31

Wiem, że to pytanie jest częściej zadawane tutaj, w Stack, ale nie mogę uzyskać prostej odpowiedzi na już zadane pytania.jQuery: Sprawdź, czy w łańcuchu znaków specjalnych istnieje

Muszę sprawdzić, czy wszystkie znaki specjalne (z wyjątkiem -) są w ciągu znaków, jeśli tak, to dać użytkownikowi ostrzeżenie.

Co mam tak daleko jest taka:

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.'); 
} 

Ale to nie wydają się działać ... Czy ktoś może mi pomóc w tej sprawie?

Z góry dziękuję!

Guido

+2

Musisz użyć wyrażenia regularnego tutaj, zamiast oddzielnych warunków bazillion. A ty ** zdecydowanie ** musisz powiedzieć, jak dokładnie "nie wydaje się działać". – Jon

+0

Zobacz, może to być pomocne na http://stackoverflow.com/questions/10505772/checking-for-any- spe- cjalnych-specjalnych-znakach- z-jQuery – Hkachhia

Odpowiedz

82

Jeśli naprawdę chcesz sprawdzić dla tych wszystkich znaków specjalnych, łatwiej jest użyć wyrażenia regularnego:

var str = $('#Search').val(); 
if(/^[a-zA-Z0-9- ]*$/.test(str) == false) { 
    alert('Your search string contains illegal characters.'); 
} 

Powyższe pozwoli jedynie ciągi składające się w całości ze znaków na zakresach a-z, A-Z, 0-9, plus łącznik znaków spacji. Ciąg zawierający dowolną inną postać spowoduje, że alert.

+0

To działa idealnie. Znacznie krócej i szybciej, dzięki! –

+0

Dodano krótkie wyjaśnienie. Minusem jest to, że nie dopuszcza znaków międzynarodowych, takich jak 'é' i' ñ', ale jeśli nie musisz ich zezwalać, to uważam, że to jest droga. – bfavaretto

+0

Działa, nawet ze znakami międzynarodowymi;) Jeszcze raz dziękuję! –

2

możliwość sprawdzania, czy ciąg zawiera wszystkie niedozwolone znaki. Zmień || s na s.

20
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.'); 
} 
4

Można również użyć metody białej listy -

var str = $('#Search').val(); 
var regex = /[^\w\s]/gi; 

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

regex w tym przykładzie jest cyfry, litery i cyfry, podkreślenia (\ W) i spacje (\ s). Daszek (^) wskazuje, że mamy szukać wszystkiego, czego nie ma w naszym regexie, więc szukaj rzeczy, które nie są znakami słownymi, podkreśleniami, cyframi i białymi znakami.

+4

To nie działa dla znaków międzynarodowych (chiński, arabski itp.). Nie użyłbym go. –

+0

'== true'? Czy nie "jeśli (regex.test (str)) {[...]}" wystarczy? – scniro

+0

Oczywiście, że to @scniro. Po prostu wstawiłem całe równanie dla jasności. –

Powiązane problemy