সংবেদন সংবেদনশীল থাকে


413

আমার নিম্নলিখিতগুলি রয়েছে:

if (referrer.indexOf("Ral") == -1) { ... }

আমি কি কি করতে পছন্দ করা হয় Ralএটা হতে পারে, যাতে কেস অসংবেদী, RAl, rAl, ইত্যাদি এবং এখনও মেলেনি।

কী বলার উপায় আছে যে Ralকেস-সংবেদনশীল হতে হবে?


3
আমি মনে করি কেস সংবেদনশীল রেজেক্স আরও মার্জিত সমাধান তবে প্রত্যেককে RegExpব্যবহারকারী ইনপুট থেকে সরাসরি তৈরি করার অসুবিধাগুলি সবার মনে রাখা উচিত । উদাহরণস্বরূপ একটি ব্যবহারকারী প্রবেশ করতে পারে *এবং একটি ত্রুটি RegExpকনস্ট্রাক্টরে নিক্ষেপ করা হবে । গৃহীত সমাধানটিতে এই সমস্যা নেই।
প্লী

উত্তর:


604

.toLowerCase()পরে যোগ করুন referrer। এই পদ্ধতিটি স্ট্রিংকে লোয়ার কেস স্ট্রিংয়ে পরিণত করে। তারপরে, এর পরিবর্তে .indexOf()ব্যবহার ralকরুন Ral

if (referrer.toLowerCase().indexOf("ral") === -1) { 

নিয়মিত এক্সপ্রেশন ব্যবহার করে এটিও অর্জন করা যেতে পারে (বিশেষত কার্যকর যখন আপনি গতিশীল নিদর্শনগুলির বিরুদ্ধে পরীক্ষা করতে চান):

if (!/Ral/i.test(referrer)) {
   //    ^i = Ignore case flag for RegExp

16
পরবর্তী পদ্ধতিটি আরও সঠিক; প্রাক্তনটি তুর্কি আমি এবং এই জাতীয় কোনও সমস্যাযুক্ত বড় হাতের / ছোট হাতের জোড়গুলির
ডোমেনিক

23
তুর্কিদের জন্য, এটি ব্যবহার করা ভাল toLocaleLowerCase()( রেফ )
মতিটি

2
দ্বিতীয়টি প্রশ্নের উত্তর দেয় না, এটি কেবল বলে যদি এটি সেখানে থাকে, ম্যাচের সূচকটি পান না। হয় প্রশ্নের শিরোনামটি ভুল, বা প্রশ্ন।
মাসলো

10
@ মাসলো এই প্রশ্নের উদাহরণটি ছিল মামলার সংবেদনশীলতা পরীক্ষা করার বিষয়ে। আপনি যদি সূচক পেতে চান তবে স্ট্রিংয়ের.search পদ্ধতিটি ব্যবহার করুন :var index = referrer.search(/Ral/i);
রব ডাব্লু

7
ডায়নামিক নিয়মিত এক্সপ্রেশন পদ্ধতির যোগকৃত জটিলতাটি হ'ল যদি অনুসন্ধানের স্ট্রিং, যেমন "রাল" তে নিয়মিত এক্সপ্রেশন বিশেষ অক্ষর থাকে যেমন $। *? ইত্যাদি। আপনার সমস্যা আছে, তাই আপনার বিশেষ চরিত্রগুলি থেকে বাঁচতে হবে, এই পোস্টে মাইক স্যামুয়েল এর উত্তর দেখুন: জাভাস্ক্রিপ্টে শেষ
জ্যাকেলরথ

94

আর একটি বিকল্প নিম্নলিখিত পদ্ধতি হিসাবে অনুসন্ধান পদ্ধতি ব্যবহার করা হয়:

if (referrer.search(new RegExp("Ral", "i")) == -1) { ...

এটি আরও মার্জিত দেখায় তারপরে পুরো স্ট্রিংটি লোয়ার কেসে রূপান্তরিত করে এটি আরও কার্যকর হতে পারে।
কোডটির toLowerCase()স্ট্রিংয়ের উপর দিয়ে দুটি পাস রয়েছে, একটি পাস এটিকে লোয়ার কেসে রূপান্তর করতে পুরো স্ট্রিংয়ে থাকে এবং অন্যটি পছন্দসই সূচকটি সন্ধান করে।
কোডটির সাথে RegExpস্ট্রিংয়ের একটি পাস রয়েছে যা এটি পছন্দসই সূচকের সাথে মেলে।

অতএব, দীর্ঘ স্ট্রিংগুলিতে আমি RegExpসংস্করণটি ব্যবহার করার পরামর্শ দিচ্ছি (আমার ধারণা যে সংক্ষিপ্ত স্ট্রিংগুলিতে এই RegExpদক্ষতাটি যদিও বস্তু তৈরির অ্যাকাউন্টে আসে )


2
আমার পরীক্ষাগুলির উপর ভিত্তি করে এটি বেশ খানিকটা দ্রুতগতিতেও রয়েছে: jsppha.com/ کیس- সংবেদনশীল- সূচক
Ilan Biala

6
2018.10.24 পর্যন্ত, টুলওয়ারক্যাস ক্রোমে বড় ব্যবধানে জয়ী হয়েছে। টুলওয়ারকেস (95,914,378 - ± 0.89% - দ্রুততম), রিজেক্স ইনডেক্স অফ (269,307 - 87 0.87% 100% ধীর)
নিক্সকোরই

21

একটি রেজিপ্যাক্স ব্যবহার করুন:

if (!/ral/i.test(referrer)) {
    ...
}

অথবা, ব্যবহার করুন .toLowerCase():

if (referrer.toLowerCase().indexOf("ral") == -1)

1
+1, "তুরস্কের আমি সমস্যা" এবং এই জাতীয় সমস্যাগুলি এড়িয়ে সম্ভবত এটি আরও সঠিক হতে পারে: i18nguy.com/unicode/turishes-i18n.html
ডোমেনিক

15

ES2016 থেকে আপনি কিছুটা ভাল / সহজ / আরও মার্জিত পদ্ধতি (কেস-সংবেদনশীল) ব্যবহার করতে পারেন:

if (referrer.includes("Ral")) { ... }

বা (কেস-সংবেদনশীল):

if (referrer.toLowerCase().includes(someString.toLowerCase())) { ... }

এখানের কিছু তুলনা হয় .indexOf()এবং .includes(): https://dev.to/adroitcoder/includes-vs-indexof-in-javascript


1
আমি মনে করি না এর অন্তর্ভুক্তগুলি কেস সংবেদনশীল
কাইল s

4
@Kyles includesহয় কেস সংবেদনশীল Chrome এর: চেষ্টা 'fooBar'.includes('bar')==>false
drzaus

10

এখানে বেশ কয়েকটি পন্থা রয়েছে।

আপনি যদি এই উদাহরণের জন্য কেস-সংবেদনশীল চেক করতে চান তবে নীচের মতো কিছু করুন।

if (referrer.toLowerCase().indexOf("Ral".toLowerCase()) == -1) {
    ...

বিকল্পভাবে, আপনি যদি নিয়মিত এই চেকটি সম্পাদন করে থাকেন তবে আপনি এতে একটি নতুন- indexOf()মত পদ্ধতি যুক্ত করতে পারেন String, তবে এটিকে সংবেদনশীল করতে পারেন।

String.prototype.indexOfInsensitive = function (s, b) {
    return this.toLowerCase().indexOf(s.toLowerCase(), b);
}

// Then invoke it
if (referrer.indexOfInsensitive("Ral") == -1) { ...

1
সমর্থনকারী আধুনিক ব্রাউজারগুলির জন্য defineProperty, আমি পরামর্শ দিই Object.defineProperty(String.prototype, 'indexOfInsensitive', {value: function(s,b){return this.toLowerCase().indexOf((s+'').toLowerCase(),b);}});। দুই আপডেটগুলি: স্পষ্ট স্ট্রিং রূপান্তর ব্যবহার (s+''), এবং একটি লুপ অ গণনীয় ( for(var i in '') ... দেখাবেন না indexOfInsensitive
রব ডব্লিউ

5
if (referrer.toUpperCase().indexOf("RAL") == -1) { ...

@ ডোমেনিক: তুর্কি সংস্কৃতির প্রতি যথাযোগ্য সম্মানের সাথে, তুরস্ককে এই দিকটি সহজ করার জন্য একটি বানান সংস্কারের বিষয়টি বিবেচনা করা উচিত । চীন সরলকরণের বিভিন্ন সংস্কার করেছে এবং তুরস্কের জনসংখ্যার তুলনায় ১০% কম, এবং অনেক সরল বর্ণমালা রয়েছে। এটা হতে পারে.
ড্যান ড্যাসকলেসকু


3

যে কোনও ভাষার উদাহরণ:

'My name is Хведор'.toLocaleLowerCase().includes('ХвЕдОр'.toLocaleLowerCase())

2

এটি ২০১ 2016, এবং এটি করার কোনও সুস্পষ্ট উপায় নেই? আমি কিছু কপিপস্তার আশা করছিলাম। আমি যেতে হবে।

নকশার নোট: আমি মেমরির ব্যবহারটি হ্রাস করতে চেয়েছিলাম এবং তাই গতি উন্নত করতে চাই - সুতরাং স্ট্রিংগুলির কোনও অনুলিপি / পরিবর্তন করা যায় না। আমি ধরে নিয়েছি ভি 8 (এবং অন্যান্য ইঞ্জিনগুলি) এই ফাংশনটি অনুকূল করতে পারে।

//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() - একই স্ট্রিংয়ে টুলওয়ারকেসে সম্ভাব্য পুনরাবৃত্তি কল।
  • RegExp- ভেরিয়েবলের সাথে অনুসন্ধান করতে বিশ্রী। এমনকি রেজিএক্সপ্যাক্স অবজেক্টটি অক্ষরগুলি থেকে বাঁচতে অস্বস্তিকর

2
এটি ২০১ 2016 সালের, এবং আপনি এখনও ভাবেন যে ইংরাজী (বা অন্যান্য ASCII- কেবলমাত্র ভাষা) বিশ্বের একমাত্র ভাষা?
রোল্যান্ড ইলিগ

3
পুনঃটুইট আমার উত্তরটি অন্যান্য সংস্কৃতিগুলিকে সামঞ্জস্য করে না, এটি একটি অসুবিধা। আমি আরও সংস্কৃতির জন্য বিস্তৃত সমর্থন মধ্যে অন্তর্দৃষ্টি স্বাগত জানাব, সহযোগীদের সাথে বিশ্বের একটি ভাল জায়গা।
টড

1

আরও ভাল অনুসন্ধান করতে নিম্নলিখিত কোডগুলি ব্যবহার করুন,

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() ) );

প্রথম সতর্কতায় (), জাভাস্ক্রিপ্ট "-1" ফিরে এসেছে - অন্য কথায়, ইনডেক্সফ () কোনও মিল খুঁজে পায় নি: এটি কেবল কারণ "জাভাস্ক্রিপ্ট" প্রথম স্ট্রিংয়ের ছোট হাতের অক্ষরে রয়েছে এবং দ্বিতীয়টিতে সঠিকভাবে মূলধন তৈরি হয়েছিল। ইনডেক্সফ () এর সাথে কেস-সংবেদনশীল অনুসন্ধানগুলি করতে, আপনি উভয় স্ট্রিং বড় হাতের বা ছোট হাতের অক্ষর তৈরি করতে পারেন। এর অর্থ হ'ল, দ্বিতীয় সতর্কতা () এর মতো, জাভাস্ক্রিপ্ট কেবল আপনি যে স্ট্রিংটির সন্ধান করছেন সেটির উপস্থিতি যাচাই করবে, মূলধন উপেক্ষা করা হবে।

রেফারেন্স, http://freewebdesignt টিউটোরিয়ালস / javaScript টিউটোরিয়ালস / jsStringObject / indexOfMethod.htm


1

যদি referrerএকটি অ্যারে হয়, আপনি ব্যবহার করতে পারেনfindIndex()

 if(referrer.findIndex(item => 'ral' === item.toLowerCase()) == -1) {...}

0

এখানে আমার গ্রহণ:

লিপি :

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(""))

এইচটিএমএল:

<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>

Codepen

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.