تحتوي Javascript على حالة غير حساسة




string case-sensitive (6)

أضف .toLowerCase() بعد referrer . يقوم هذا الأسلوب بتحويل السلسلة في سلسلة أحرف صغيرة. ثم استخدم .indexOf() باستخدام ral بدلاً من Ral .

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

يمكن أيضًا تحقيق ذلك باستخدام تعبير عادي (مفيد بشكل خاص عندما تريد اختبار الأنماط الديناميكية):

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

لدي ما يلي:

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

ما أحب القيام به هو جعل حالة Ral غير حساسة ، بحيث يمكن أن يكون RAl ، rAl ، وما إلى ذلك ، وما زالت rAl .

هل هناك طريقة للقول بأن Ral يجب أن يكون غير حساس لحالة الأحرف؟


إنه عام 2016 ، وليس هناك طريقة واضحة لكيفية القيام بذلك؟ كنت اتمنى بعض copypasta. سآخذ الذهاب.

ملاحظات التصميم: أردت تقليل استخدام الذاكرة ، وبالتالي تحسين السرعة - لذلك لا يوجد نسخ / تحوير للخيوط. أفترض 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;
}

السبب الخاص بي للاسم:

  • يجب أن يكون IndexOf في الاسم
  • لا تضيف لاحقة - من يشير إلى المعلمة التالية
  • لا تستخدم "caseInsensitive" الذي هو طويل جدا
  • "طبيعي" هو مرشح جيد ، لأن المقارنات الافتراضية لحالة الأحرف ليست طبيعية على البشر في المقام الأول.

لما لا...:

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

في التنبيه الأول () ، عاد JavaScript "-1" - بمعنى آخر ، لم يجد indexOf () تطابقًا: هذا ببساطة لأن "JavaScript" موجود في أحرف صغيرة في السلسلة الأولى ، ويتم تكبيره بشكل صحيح في الثانية. لإجراء عمليات بحث غير حساسة لحالة الأحرف باستخدام indexOf () ، يمكنك جعل كلتا السلسلتين إما كبيرة أو صغيرة. وهذا يعني أنه ، كما هو الحال في التنبيه الثاني () ، سيقوم JavaScript بالتحقق فقط من تواجد السلسلة التي تبحث عنها ، ويتم تجاهل الكتابة بالأحرف الكبيرة.

المرجع ، http://freewebdesigntutorials.com/javaScriptTutorials/jsStringObject/indexOfMethod.htm


هنا خذني:

سيناريو :

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>

Codepen


هناك طريقتان هنا.

إذا كنت تريد إجراء فحص حساس لحالة الأحرف فقط لهذا المثال ، فقم بإجراء ما يلي.

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) { ...

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




case-insensitive