Yanıtlar:
.toLowerCase()
Sonra ekleyin referrer
. Bu yöntem, dizeyi küçük harfli bir dizede döndürür. Sonra, yerine .indexOf()
kullanarak ral
kullanın Ral
.
if (referrer.toLowerCase().indexOf("ral") === -1) {
Aynı şey Düzenli İfade kullanılarak da elde edilebilir (özellikle dinamik kalıplara karşı test etmek istediğinizde yararlıdır):
if (!/Ral/i.test(referrer)) {
// ^i = Ignore case flag for RegExp
.search
yöntemini kullanın :var index = referrer.search(/Ral/i);
Başka bir seçenek de arama yöntemini aşağıdaki gibi kullanmaktır:
if (referrer.search(new RegExp("Ral", "i")) == -1) { ...
Tüm dizeyi küçük harfe dönüştürmekten daha zarif görünüyor ve daha verimli olabilir.
İle toLowerCase()
kod dizesi üzerinde iki paso olur, tek geçişli küçük harfe dönüştürmek için tüm iple başka istenen dizin için bakmaktır. Kod
ile RegExp
istenen dizine uyuyor gibi görünüyor dize üzerinde bir geçiş var.
Bu nedenle, uzun dizelerde RegExp
sürümü kullanmanızı öneririm (kısa dizelerde bu verimlilik, RegExp
nesneyi oluşturmanın hesabında geliyor sanırım )
RegExp kullanın:
if (!/ral/i.test(referrer)) {
...
}
Veya şunu kullanın .toLowerCase()
:
if (referrer.toLowerCase().indexOf("ral") == -1)
ES2016'dan biraz daha iyi / daha kolay / daha zarif bir yöntem de kullanabilirsiniz (büyük / küçük harfe duyarlı):
if (referrer.includes("Ral")) { ... }
veya (büyük / küçük harf duyarlı):
if (referrer.toLowerCase().includes(someString.toLowerCase())) { ... }
İşte bazı karşılaştırmaları .indexOf()
ve .includes()
:
https://dev.to/adroitcoder/includes-vs-indexof-in-javascript
includes
, Chrome'da büyük / küçük harfe duyarlıdır : try 'fooBar'.includes('bar')
==>false
Burada birkaç yaklaşım var.
Yalnızca bu örnek için büyük / küçük harfe duyarlı olmayan bir denetim gerçekleştirmek istiyorsanız, aşağıdakine benzer bir şey yapın.
if (referrer.toLowerCase().indexOf("Ral".toLowerCase()) == -1) {
...
Alternatif olarak, bu kontrolü düzenli olarak gerçekleştiriyorsanız, yeni bir benzer indexOf()
yöntem ekleyebilir String
, ancak büyük / küçük harfe duyarsız hale getirebilirsiniz.
String.prototype.indexOfInsensitive = function (s, b) {
return this.toLowerCase().indexOf(s.toLowerCase(), b);
}
// Then invoke it
if (referrer.indexOfInsensitive("Ral") == -1) { ...
defineProperty
öneririm Object.defineProperty(String.prototype, 'indexOfInsensitive', {value: function(s,b){return this.toLowerCase().indexOf((s+'').toLowerCase(),b);}});
. İki güncelleme: Açık bir dize dönüştürme kullanarak (s+'')
ve bir döngüde numaralandırılamaz ( for(var i in '') ...
gösterilmez indexOfInsensitive
.
if (referrer.toUpperCase().indexOf("RAL") == -1) { ...
Bunu deneyebilirsin
str = "Wow its so COOL"
searchStr = "CoOl"
console.log(str.toLowerCase().includes(searchStr.toLowerCase()))
Herhangi bir dil için örnek:
'My name is Хведор'.toLocaleLowerCase().includes('ХвЕдОр'.toLocaleLowerCase())
2016, ve bunu nasıl yapmanın net bir yolu yok? Biraz kopyasını umuyordum. Bir deneyeceğim.
Tasarım notları: Bellek kullanımını en aza indirgemek ve bu nedenle hızı arttırmak istedim - böylece dizelerin kopyalanması / mutasyona uğraması söz konusu değil. Sanırım V8 (ve diğer motorlar) bu işlevi optimize edebilir.
//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;
}
İsim nedenim:
Neden olmasın...:
toLowerCase()
- aynı dizede olası LoLCase çağrıları.RegExp
- değişkenle arama yapmak garip. RegExp nesnesi bile karakterlerden kaçmak zorunda kalıyorDaha iyi bir arama yapmak için aşağıdaki kodu kullanın,
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() ) );
İlk uyarıda (), JavaScript "-1" döndürdü - başka bir deyişle, indexOf () bir eşleşme bulamadı: Bunun nedeni "JavaScript" in ilk dizede küçük harf olması ve ikincisinde uygun şekilde büyük harf kullanılmasıdır. İndexOf () ile büyük / küçük harfe duyarlı olmayan arama yapmak için her iki dizeyi de büyük veya küçük harf yapabilirsiniz. Bu, ikinci uyarıda () olduğu gibi JavaScript'in yalnızca aradığınız dizenin oluşumunu kontrol edeceği, büyük harf kullanımının yok sayıldığı anlamına gelir.
Referans, http://freewebdesigntutorials.com/javaScriptTutorials/jsStringObject/indexOfMethod.htm
Bir referrer
dizi ise,findIndex()
if(referrer.findIndex(item => 'ral' === item.toLowerCase()) == -1) {...}
İşte benim almam:
Senaryo :
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>
RegExp
doğrudan kullanıcı girdisi yaratmanın tuzaklarını akılda tutmak gerekir . Örneğin, bir kullanıcı girebilir*
ve yapıcıya bir hata atılırRegExp
. Kabul edilen çözümde bu sorun yoktur.