2009-08-07 20 views
13

Próbuję ustalić, czy obraz ma w swojej nazwie źródłowej noPic, który może być w górnej lub małej litery.JavaScript indexOf ignorować Case

var noPic = largeSrc.indexOf("nopic"); 

powinienem napisać:

var noPic = largeSrc.toLowerCase().indexOf("nopic"); 

Ale to rozwiązanie nie działa ...

+0

Co to jest largeSrc? Jesteś pewien, że to ciąg? –

+0

Użyj debuggera. Ustaw punkt przerwania na linii 'var noPic = ... 'i zobacz jaki jest typ i wartość' largeSrc'. Lub możesz umieścić 'console.log (typeof largeSrc, largeSrc);' przed linią. Ale z tego pytania wynika, że ​​nie znasz interaktywnego debuggera JavaScript w przeglądarce. Gorąco polecam zapoznanie się z tym. Na przykład: [Samouczek programu Chrome DevTools] (https://developer.chrome.com/devtools). –

Odpowiedz

21

Można użyć wyrażenia regularnego z case-niewrażliwy modyfikatora - wprawdzie niekoniecznie tak szybko jak indexOf.

var noPic = largeSrc.search(/nopic/i); 
+6

Według: http://jsperf.com/regex-vs-tolowercase-then-regex/2 metoda regex jest szybsza niż toLower() –

+1

metoda regex kończy się wolniej, jeśli wyszukiwane hasło pochodzi od danych wprowadzonych przez użytkownika, zobacz moją odpowiedź tutaj http://stackoverflow.com/a/19920595/1333402 – ssmith

+1

Tak, ponieważ różnica 50ms jest naprawdę mnie wkurza ... – ppumkin

14

Nie, nie ma wielkości liter sposobem wywołania tej funkcji. Być może powodem, dla którego twój drugi przykład nie działa, jest brak połączenia z funkcją text().

Spróbuj tego:

var search = "nopic"; 
var noPic = largeSrc.text().toLowerCase().indexOf(search.toLowerCase()); 
+0

Należy zauważyć, że funkcja indexOf() może być wolna dla dużych ciągów, zobacz http://stackoverflow.com/a/4579228/1333402 – ssmith

2

Zauważ, że jeśli ciąg wyszukiwania jest od danych wejściowych użytkownika musisz uciec znaki specjalne wyrażeń regularnych, które w końcu spowalnia podejściu wyrażeń regularnych, dzięki czemu toLowerCase() zbliżyć się najszybciej w tym przypadku.

Oto, co to będzie wyglądać:

var search = getUserInput(); 

/* this slows it down */ 
var regex = RegExp(search.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), "i"); 

var noPic = testString.search(regex); 

Zobacz zaktualizowaną jsperf: http://jsperf.com/regex-vs-tolowercase-then-regex/4

przypis: regexp ucieczce z https://stackoverflow.com/a/3561711/1333402

2

Spróbuj z:

var lowerCaseLargeSrc = largeSrc.toLowerCase(); 
var noPic = lowerCaseLargeSrc.indexOf("nopic"); 
0

Twój kod będzie działał tylko wtedy, gdy largeSrc jest już ciągiem. Być może zamiast tego otrzymujesz dane wejściowe będące elementem html. Tak więc użyj jQuery, aby rozwiązać każdy potencjalny element wejściowy w tekście, który jest w środku. Przykład:

var noPic = largeSrc.text().toLowerCase().indexOf("nopic");