Saya memiliki berikut:
if (referrer.indexOf("Ral") == -1) { ... }
Apa yang saya ingin lakukan adalah untuk membuat Ral
case sensitive, sehingga dapat RAl
, rAl
, dll. dan masih cocok.
Apakah ada cara untuk mengatakan bahwa Ral
telah menjadi kasus-sensitif?
Tambahkan .toLowerCase()
setelah pengarah
. Metode ini ternyata string yang lebih rendah kasus string. Kemudian, gunakan .indexOf()
menggunakan ral
bukan Ral
.
if (referrer.toLowerCase().indexOf("ral") === -1) {
Hal yang sama juga dapat dicapai dengan menggunakan Regular Expression (terutama berguna ketika anda ingin menguji terhadap pola dinamis):
if (!/Ral/i.test(referrer)) {
// ^i = Ignore case flag for RegExp
Opsi lain adalah dengan menggunakan metode pencarian sebagai berikut:
if (referrer.search(new RegExp("Ral", "i")) == -1) { ...
Ini terlihat lebih elegan kemudian mengubah seluruh string ke huruf kecil dan mungkin lebih efisien.
Dengan toLowerCase()
kode memiliki dua melewati string, satu lulus pada seluruh untuk mengkonversi string ke huruf kecil dan yang lain adalah untuk mencari yang diinginkan index.
Dengan RegExp
kode memiliki satu melewati string yang terlihat untuk pertandingan yang diinginkan index.
Oleh karena itu, pada string panjang saya sarankan untuk menggunakan RegExp
versi (saya kira bahwa pada string pendek efisiensi ini datang pada akun menciptakan RegExp
objek meskipun)
Ada beberapa pendekatan berikut ini.
Jika anda ingin melakukan hal-sensitive check ini hanya untuk contoh, melakukan sesuatu seperti berikut ini.
if (referrer.toLowerCase().indexOf("Ral".toLowerCase()) == -1) {
...
Atau, jika anda'kembali melakukan pemeriksaan ini secara teratur, anda dapat menambahkan baru indexOf()
-seperti metode untuk String
, tapi itu case sensitive.
String.prototype.indexOfInsensitive = function (s, b) {
return this.toLowerCase().indexOf(s.toLowerCase(), b);
}
// Then invoke it
if (referrer.indexOfInsensitive("Ral") == -1) { ...
Dari ES2016 anda juga dapat menggunakan sedikit lebih baik / mudah / lebih elegan metode:
if (referrer.includes("Ral")) { ... }
atau
if (referrer.toLowerCase().includes(someString.toLowerCase())) { ... }
Berikut ini adalah beberapa perbandingan .indexOf()
dan .termasuk()
:
https://dev.to/adroitcoder/includes-vs-indexof-in-javascript
It's 2016, dan ada's tidak ada cara yang jelas tentang bagaimana untuk melakukan hal ini? Saya berharap untuk beberapa copypasta. I'll harus pergi.
Desain notes: saya ingin meminimalkan penggunaan memori, dan oleh karena itu meningkatkan kecepatan sehingga tidak menyalin/bermutasi dari string. Saya berasumsi V8 (dan mesin lainnya) dapat mengoptimalkan fungsi ini.
//TODO: Performance testing
String.prototype.naturalIndexOf = function(needle) {
//TODO: guard conditions here
var haystack = this; //You can replace `haystack` for `this` below but I wan't to make the algorithm more readable for the answer
var needleIndex = 0;
var foundAt = 0;
for (var haystackIndex = 0; haystackIndex < haystack.length; haystackIndex++) {
var needleCode = needle.charCodeAt(needleIndex);
if (needleCode >= 65 && needleCode <= 90) needleCode += 32; //ToLower. I could have made this a function, but hopefully inline is faster and terser
var haystackCode = haystack.charCodeAt(haystackIndex);
if (haystackCode >= 65 && haystackCode <= 90) haystackCode += 32; //ToLower. I could have made this a function, but hopefully inline is faster and terser
//TODO: code to detect unicode characters and fallback to toLowerCase - when > 128?
//if (needleCode > 128 || haystackCode > 128) return haystack.toLocaleLowerCase().indexOf(needle.toLocaleLowerCase();
if (haystackCode !== needleCode)
{
foundAt = haystackIndex;
needleIndex = 0; //Start again
}
else
needleIndex++;
if (needleIndex == needle.length)
return foundAt;
}
return -1;
}
Alasan saya untuk nama:
Mengapa tidak...:
toLowerCase()
- potensi panggilan berulang-ulang untuk toLowerCase pada string yang sama.RegExp
- canggung untuk pencarian dengan variabel. Bahkan RegExp objek canggung harus melarikan diri karakterUntuk melakukan pencarian yang lebih baik gunakan kode berikut,
var myFav = "javascript";
var theList = "VB.NET, C#, PHP, Python, JavaScript, and Ruby";
// Check for matches with the plain vanilla indexOf() method:
alert( theList.indexOf( myFav ) );
// Now check for matches in lower-cased strings:
alert( theList.toLowerCase().indexOf( myFav.toLowerCase() ) );
Dalam peringatan pertama(), JavaScript kembali "-1" - dengan kata lain, indexOf() tidak menemukan kecocokan: ini hanya karena "JavaScript" dalam huruf kecil dalam string pertama, dan benar beribukota di kedua. Untuk melakukan case-sensitive pencarian dengan indexOf(), anda dapat membuat kedua string huruf besar atau huruf kecil. Ini berarti bahwa, seperti dalam peringatan kedua(), JavaScript hanya akan memeriksa untuk terjadinya string yang anda cari, kapitalisasi diabaikan.
Referensi, http://freewebdesigntutorials.com/javaScriptTutorials/jsStringObject/indexOfMethod.htm
Berikut ini's saya ambil:
Script:
var originalText = $("#textContainer").html()
$("#search").on('keyup', function () {
$("#textContainer").html(originalText)
var text = $("#textContainer").html()
var val = $("#search").val()
if(val=="") return;
var matches = text.split(val)
for(var i=0;i<matches.length-1;i++) {
var ind = matches[i].indexOf(val)
var len = val.length
matches[i] = matches[i] + "<span class='selected'>" + val + "</span>"
}
$("#textContainer").html(matches.join(""))
HTML:
<input type="text" id="search">
<div id="textContainer">
lorem ipsum is simply dummy text of the printing and typesetting industry. lorem ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of letraset sheets containing lorem ipsum passages, and more recently with desktop publishing software like Aldus pagemaker including versions of lorem ipsum.</div>