回答:
.toLowerCase()
後に追加しreferrer
ます。このメソッドは、文字列を小文字に変換します。次に、の代わりに.indexOf()
usingを使用しral
ますRal
。
if (referrer.toLowerCase().indexOf("ral") === -1) {
正規表現を使用して同じことを実現することもできます(動的パターンに対してテストする場合に特に役立ちます)。
if (!/Ral/i.test(referrer)) {
// ^i = Ignore case flag for RegExp
.search
:方法var index = referrer.search(/Ral/i);
別のオプションは、次のように検索方法を使用することです:
if (referrer.search(new RegExp("Ral", "i")) == -1) { ...
文字列全体を小文字に変換するよりもエレガントに見え、より効率的かもしれません。コード列上の2つのパスを持って、ワンパスは小文字に変換する文字列全体上にあり、別の所望のインデックスを探すことです。
とtoLowerCase()
RegExp
コードが所望のインデックスに一致するように見える文字列の上で1つのパスを持っています。
したがって、長い文字列ではRegExp
バージョンを使用することをお勧めします(短い文字列では、この効率はRegExp
オブジェクトを作成するために得られると思います)
RegExpを使用します。
if (!/ral/i.test(referrer)) {
...
}
または、次を使用します.toLowerCase()
:
if (referrer.toLowerCase().indexOf("ral") == -1)
ES2016からは、少し優れた/簡単な/よりエレガントな方法(大文字と小文字を区別)も使用できます。
if (referrer.includes("Ral")) { ... }
または(大文字と小文字を区別しない):
if (referrer.toLowerCase().includes(someString.toLowerCase())) { ... }
ここではいくつかの比較である.indexOf()
と.includes()
:
https://dev.to/adroitcoder/includes-vs-indexof-in-javascript
includes
は大文字と小文字を区別します:try 'fooBar'.includes('bar')
==>false
ここにはいくつかのアプローチがあります。
このインスタンスのみに対して大文字と小文字を区別しないチェックを実行する場合は、次のようなことを行います。
if (referrer.toLowerCase().indexOf("Ral".toLowerCase()) == -1) {
...
または、このチェックを定期的に実行している場合は、新しいindexOf()
-likeメソッドをに追加できますがString
、大文字と小文字は区別されません。
String.prototype.indexOfInsensitive = function (s, b) {
return this.toLowerCase().indexOf(s.toLowerCase(), b);
}
// Then invoke it
if (referrer.indexOfInsensitive("Ral") == -1) { ...
defineProperty
、お勧めしObject.defineProperty(String.prototype, 'indexOfInsensitive', {value: function(s,b){return this.toLowerCase().indexOf((s+'').toLowerCase(),b);}});
ます。使用して明示的な文字列変換:2つの更新(s+'')
ループでは、非列挙(for(var i in '') ...
表示されませんindexOfInsensitive
。
if (referrer.toUpperCase().indexOf("RAL") == -1) { ...
任意の言語の例:
'My name is Хведор'.toLocaleLowerCase().includes('ХвЕдОр'.toLocaleLowerCase())
それは2016年であり、これを行う方法の明確な方法はありませんか?コピーパスタを期待していた。行きます。
デザインノート:メモリ使用量を最小限に抑え、速度を向上させたいと考えていました。文字列のコピー/変更はありません。V8(および他のエンジン)がこの機能を最適化できると思います。
//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;
}
名前の理由:
何故なの...:
toLowerCase()
-同じ文字列でtoLowerCaseが繰り返し呼び出される可能性があります。RegExp
-変数で検索するのは面倒です。RegExpオブジェクトでさえ文字をエスケープしなければならないのは厄介ですより良い検索を行うには、次のコードを使用します、
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() ) );
最初のalert()で、JavaScriptは「-1」を返しました。つまり、indexOf()は一致を検出しませんでした。これは、「JavaScript」が最初の文字列で小文字で、2番目の文字列で適切に大文字になっているためです。indexOf()で大文字と小文字を区別しない検索を実行するには、両方の文字列を大文字または小文字にできます。つまり、2番目のalert()と同様に、JavaScriptは探している文字列の出現のみをチェックし、大文字小文字は無視されます。
リファレンス、 http://freewebdesigntutorials.com/javaScriptTutorials/jsStringObject/indexOfMethod.htm
referrer
が配列の場合、使用できますfindIndex()
if(referrer.findIndex(item => 'ral' === item.toLowerCase()) == -1) {...}
これが私の見解です。
スクリプト:
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
ユーザー入力から直接を作成する場合の落とし穴を誰もが覚えておく必要があります。たとえば、ユーザーが入力する*
と、RegExp
コンストラクタでエラーがスローされます。承認されたソリューションにはこの問題はありません。