Как найти подстроку без учета регистра

I am trying to find if an image has in its source name noPic which can be in upper or lower case.

var noPic = largeSrc.indexOf("nopic");

Should I write :

var noPic = largeSrc.toLowerCase().indexOf("nopic");

But this solution doesn’t work…

Mamun's user avatar

Mamun

65.5k9 gold badges47 silver badges59 bronze badges

asked Aug 7, 2009 at 17:13

adardesign's user avatar

2

You can use regex with a case-insensitive modifier — admittedly not necessarily as fast as indexOf.

var noPic = largeSrc.search(/nopic/i);

answered Aug 7, 2009 at 17:17

jharlap's user avatar

jharlapjharlap

8267 silver badges5 bronze badges

6

No, there is no case-insensitive way to call that function. Perhaps the reason your second example doesn’t work is because you are missing a call to the text() function.

Try this:

var search = "nopic";
var noPic = largeSrc.text().toLowerCase().indexOf(search.toLowerCase());

Community's user avatar

answered Aug 7, 2009 at 17:15

Andrew Hare's user avatar

Andrew HareAndrew Hare

343k71 gold badges636 silver badges634 bronze badges

1

Note that if the search string is from user input you’ll need to escape the special regexp characters.

Here’s what it would look like:

var search = getUserInput();

/* case-insensitive search takes around 2 times more than simple indexOf() */
var regex = RegExp(search.replace(/[-/\^$*+?.()|[]{}]/g, '\$&'), "i");

var noPic = testString.search(regex);

See the updated jsperf: http://jsperf.com/regex-vs-tolowercase-then-regex/4

footnote: regexp escaping from https://stackoverflow.com/a/3561711/1333402

Klesun's user avatar

Klesun

12k5 gold badges57 silver badges51 bronze badges

answered Nov 12, 2013 at 3:57

ssmith's user avatar

ssmithssmith

6849 silver badges11 bronze badges

1

Try with:

var lowerCaseLargeSrc = largeSrc.toLowerCase();
var noPic = lowerCaseLargeSrc.indexOf("nopic");

Lupus Ossorum's user avatar

answered Oct 28, 2014 at 14:25

user3046510's user avatar

1

Your code will only work if largeSrc is already a string. You might be getting an input that’s an html element instead. So, use jQuery to resolve any potential input element into the text that’s inside it. Example:

var noPic = largeSrc.text().toLowerCase().indexOf("nopic");

Barett's user avatar

Barett

5,7876 gold badges50 silver badges55 bronze badges

answered Nov 19, 2015 at 20:05

bylerj's user avatar

0

How about using findIndex instead that way you can do all your toLowerCase() inside the callback. Worked great for me:

// Not Supported in IE 6-11
const arr = ['HELLO', 'WORLD'];
const str = 'world';

const index = arr.findIndex(element => {
  return element.toLowerCase() === str.toLowerCase();
});

console.log(index); // 👉️ 1

if (index !== -1) {
  // 👉️ string is in the array
}

Credit:
https://bobbyhadz.com/blog/javascript-make-array-indexof-case-insensitive

answered May 25, 2022 at 17:33

mcirami's user avatar

Possible Duplicate:
Case insensitive contains(string)

With Contains() method of String class a substring can be found.
How to find a substring in a string in a case-insensitive manner?

Community's user avatar

asked Dec 13, 2011 at 19:04

Falcon's user avatar

0

You can use the IndexOf() method, which takes in a StringComparison type:

string s = "foobarbaz";
int index = s.IndexOf("BAR", StringComparison.CurrentCultureIgnoreCase); // index = 3

If the string was not found, IndexOf() returns -1.

answered Dec 13, 2011 at 19:06

Marty's user avatar

MartyMarty

7,4141 gold badge31 silver badges51 bronze badges

0

There’s no case insensitive version. Use IndexOf instead (or a regex though that is not recommended and overkill).

string string1 = "my string";
string string2 = "string";
bool isContained = string1.IndexOf(string2, StringComparison.OrdinalIgnoreCase) >= 0;

StringComparison.OrdinalIgnoreCase is generally used for more «programmatic» text like paths or constants that you might have generated and is the fastest means of string comparison. For text strings that are linguistic use StringComparison.CurrentCultureIgnoreCase or StringComparison.InvariantCultureIgnoreCase.

plr108's user avatar

plr108

1,19110 silver badges16 bronze badges

answered Dec 13, 2011 at 19:08

scottheckel's user avatar

scottheckelscottheckel

9,0761 gold badge35 silver badges47 bronze badges

2

Contains returns a boolean if a match is found. If you want to search case-insensitive, you can make the source string and the string to match both upper case or lower case before matching.

Example:

if(sourceString.ToUpper().Contains(stringToFind.ToUpper()))
{
    // string is found
}

answered Dec 13, 2011 at 19:06

Jesse van Assen's user avatar

Jesse van AssenJesse van Assen

2,2322 gold badges16 silver badges19 bronze badges

1

stringToSearch.ToLower().Contains(stringToSearchFor.ToLower())

answered Dec 13, 2011 at 19:07

Esoteric Screen Name's user avatar

1

string myString = "someTextorMaybeNot";
myString.ToUpper().Contains( "text".ToUpper() );

answered Dec 13, 2011 at 19:07

Muad'Dib's user avatar

Muad’DibMuad’Dib

28.3k5 gold badges55 silver badges68 bronze badges

1

(PHP 5, PHP 7, PHP 8)

striposВозвращает позицию первого вхождения подстроки без учёта регистра

Описание

stripos(string $haystack, string $needle, int $offset = 0): int|false

В отличие от strpos(), эта функция не
учитывает регистр символов.

Список параметров

haystack

Строка, в которой производится поиск.

needle

Заметьте, что needle может содержать
строку из одного или более символов.

До PHP 8.0.0, если параметр needle не является строкой,
он преобразуется в целое число и трактуется как код символа.
Это поведение устарело с PHP 7.3.0, и полагаться на него крайне не рекомендуется.
В зависимости от предполагаемого поведения,
параметр needle должен быть либо явно приведён к строке,
либо должен быть выполнен явный вызов chr().

offset

Если этот параметр указан, то поиск будет начат с указанного количества символов с
начала строки. Если задано отрицательное значение, отсчёт позиции начала поиска
будет произведён с конца строки.

Возвращаемые значения

Возвращает позицию, в которой находится искомая строка, относительно
начала строки haystack (независимо от смещения (offset)).
Также обратите внимание на то, что позиция строки отсчитывается от 0, а не от 1.

Возвращает false, если искомая строка не найдена.

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Список изменений

Версия Описание
8.2.0 Преобразование регистра больше не зависит от локали, установленной с помощью
функции setlocale(). Будут преобразованы только символы ASCII.
Байты не ASCII-кодировке будут сравниваться по значению байта.
8.0.0 Передача целого числа (int) в needle больше не поддерживается.
7.3.0 Передача целого числа (int) в needle объявлена устаревшей.
7.1.0 Добавлена поддержка отрицательных значений offset.

Примеры

Пример #1 Пример использования stripos()


<?php
$findme
= 'a';
$mystring1 = 'xyz';
$mystring2 = 'ABC';$pos1 = stripos($mystring1, $findme);
$pos2 = stripos($mystring2, $findme);// Конечно, 'a' не входит в 'xyz'
if ($pos1 === false) {
echo
"Строка '$findme' не найдена в строке '$mystring1'";
}
// Заметьте, что используется ===. Использование == не даст верного
// результата, так как 'a' в нулевой позиции.
if ($pos2 !== false) {
echo
"Нашёл '$findme' в '$mystring2' в позиции $pos2";
}
?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • mb_stripos() — Регистронезависимый поиск позиции первого вхождения одной строки в другую
  • str_contains() — Определяет, содержит ли строка заданную подстроку
  • str_ends_with() — Проверяет, заканчивается ли строка заданной подстрокой
  • str_starts_with() — Проверяет, начинается ли строка с заданной подстроки
  • strpos() — Возвращает позицию первого вхождения подстроки
  • strrpos() — Возвращает позицию последнего вхождения подстроки в строке
  • strripos() — Возвращает позицию последнего вхождения подстроки без учёта регистра
  • stristr() — Регистронезависимый вариант функции strstr
  • substr() — Возвращает подстроку
  • str_ireplace() — Регистронезависимый вариант функции str_replace

emperorshishire at gmail dot com

14 years ago


I found myself needing to find the first position of multiple needles in one haystack.  So I wrote this little function:

<?php
function multineedle_stripos($haystack, $needles, $offset=0) {
    foreach(
$needles as $needle) {
       
$found[$needle] = stripos($haystack, $needle, $offset);
    }
    return
$found;
}
// It works as such:
$haystack = "The quick brown fox jumps over the lazy dog.";
$needle = array("fox", "dog", ".", "duck")
var_dump(multineedle_stripos($haystack, $needle));
/* Output:
   array(3) {
     ["fox"]=>
     int(16)
     ["dog"]=>
     int(40)
     ["."]=>
     int(43)
     ["duck"]=>
     bool(false)
   }
*/
?>


sorrynorealemail at example dot com

4 years ago


Unlike strpos() it seems that stripos() does NOT issue a WARNING if the needle is an empty string ''.

emanuel dot karlsson at rolfsbuss dot se

4 years ago


Finding numbers in strings requires you to cast the number to string first.

strpos("123", 2) !== strpos("123", "2")


spam at kleppinger dot com

8 years ago


Regarding the function by spam at wikicms dot org

It is very bad practice to use the same function name as an existing php function but have a different output format.  Someone maintaining the code in the future is likely to be very confused by this.  It will also be hard to eradicate from a codebase because the naming is identical so each use of stripos() would have to be analyzed to see how it is expecting the output format (bool or number/bool).

Calling it string_found() or something like that would make a lot more sense for long-term use.


Ian Macdonald

7 years ago


Regarding the === note, it might be worth clarifying that the correct tests for a binary found/not found condition are  !==false to detect found, and ===false to detect not found.

steve at opilo dot net

9 years ago


A handy function if you need to adjust layout based on whether or not a string contains descending letters:

<?php function containsDescenders($text) {
   
$descenders = array("g","j","p","q","y");
    foreach (
$descenders as $letter) {
        if (
stripos($text,$letter) !== false) {
            return
true;
        }
    }
    return
false;
}
?>


spam at wikicms dot org

9 years ago


If you like using ternary operator, I wrote simple example how to use stripos function.
Also, in my example I add "How to use namespaces" for wide knowledges for newbies.

<?php
namespace My;//You can be free using core functions in your NameSpaces (My)
function stripos($haystack, $needle) {
   
//To call core function (from global NS) you should add backslash only - func
   
return (FALSE === stripos($haystack, $needle)) ? FALSE : TRUE;
}
var_dump(stripos($haystack = 'John knows English language.', $needle = 'john')); //TRUE
var_dump(stripos($haystack = 'Sara knows English language too.', $needle = 'john')); //FALSE
?>


grf at post dot cz

16 years ago


this would to work with any language, i hope.

tested on czech (eastern europe) lang.

<?php

/****************************************

*    SAFE HIGHLIGHT

****************************************/

/**

* function finds and encase every string in a $needleArr array with

* strings $shearLft (from the left side) and $shearRgt (guess from which

* side).

* already encased needles are IGNORED for any other step, so order

* of needles in $needleArr is pretty important.

*

* function is searching needles in case-insensitive mode,

* but case in the subject is saved.

*

* can you do it better? so, do it.

*

* @param array $needleArr array of needles

* @param string $shearLft left shear

* @param string $shearRgt right shear

* @param string $subject subject

* @param string $encoding encoding ('utf-8' is default)

*

* @author griffin

*/

function safeHighlight( $needleArr, $shearLft, $shearRgt, $subject, $encoding = 'utf-8')

{
// encoding

   
$e = $encoding;
// oh, no needles

   
if( !is_array( $needleArr))

        return
$subject;
// empty keys throw-off, only unique, reindex

   
$nA = array_values(

           
array_unique(

               
array_diff( $needleArr, array(''))

            )

        );
// needle count

   
if( !($nC = count( $nA)))

        return
$subject; // nothing to hl

       
    // shear length

if( !(($rLL = mb_strlen( $rL = $shearLft, $e))

    + (
$rRL = mb_strlen( $rR = $shearRgt, $e))))

        return
$subject; // no shears

   
    // subject length

if( !($sL = mb_strlen( $s = $subject, $e)))

        return
null; // empty subject

       
    // subject in lowercase (we need to aviod

    // using mb_stripos due to PHP version)

$sW = mb_strtolower( $s, $e);
// masking ~ 0=not changed, 1=changed

   
$m = str_repeat( '0', $sL);
// loop for each needle

   
for( $n=0; $n<$nC; $n++)

    {
// needle string loWercase

       
$nW = mb_strtolower( $nA[ $n], $e);
$o = 0; // offset

       
$nL = mb_strlen( $nW, $e); // needle length

        // search needle

while( false !== ($p = mb_strpos( $sW, $nW, $o, $e)))

        {

           
// oh hurrey, needle found on $p position

           
            // is founded needle already modified? (in full-length)

for( $q=$p; $q<($p+$nL); $q++)

                if(
$m[ $q])

                {

                   
// ai, caramba. already modified, jump over

                   
$o+= $nL;
// continue for while() loop - not for for() loop!

                   
continue 2;

                }
// explode subject and mask into three parts

            // partA|needle|partB

           
$sE[0] = mb_substr( $s, 0, $p, $e);

           
$sE[1] = mb_substr( $s, $p, $nL, $e);

           
$sE[2] = mb_substr( $s, $p+$nL, $sL-$p-$nL, $e);
// mask

            // partA|partB (needle not needed)

           
$mE[0] = mb_substr( $m, 0, $p, $e);

           
$mE[1] = mb_substr( $m, $p+$nL, $sL-$p-$nL, $e);
// apply shears

           
$sE[1] = $rL.$sE[1].$rR;
// update sunject length

           
$sL+= $rLL + $rRL;
// update mask

           
$m = $mE[0] . str_repeat( '1', $rLL + $nL + $rRL) . $mE[1];
// implode into a subject

           
$s = implode( $sE);
// update lowercase subject

           
$sW = mb_strtolower( $s, $e);
// increase offset

           
$o+= $rLL + $nL + $rRL;
// end of string reached

           
if( $o>=$sL)

                break;

           
        }

// while()
} // for( $n=0; $n<$nC; $n++)

   
    // oouu yeaaa, kick the subject out of the function

return $s;

   
}

// function safeHighlight()

/****************************************

*    END: SAFE HIGHLIGHT

****************************************/

?>


Как найти слово в строке без учета регистра?

"Привет, мир".indexOf("Привет") вернет 0, как и надо
"Привет, мир".indexOf("привет")
вернет -1, как НЕ надо, заменил «Привет» на «привет» буква «п» стала маленькой
как сделать поиск регистра-независимым?


  • Вопрос задан

    более трёх лет назад

  • 25749 просмотров

Если не требуется поиск позиции где встретилось значение, можно регуляркой:

var str = 'Привет, мир';
var reg = /привет/i;
reg.test(str) => true

"Привет, мир".toUpperCase().indexOf("мир".toUpperCase())

Пригласить эксперта

use toLowerCase()
«Привет, мир».toLowerCase().indexOf(«привет»)


  • Показать ещё
    Загружается…

28 мая 2023, в 22:23

1000 руб./за проект

28 мая 2023, в 21:40

125000 руб./за проект

28 мая 2023, в 21:33

20000 руб./за проект

Минуточку внимания

stripos

(PHP 5, PHP 7)

striposВозвращает позицию первого вхождения подстроки без учета регистра

Описание

mixed stripos
( string $haystack
, string $needle
[, int $offset = 0
] )

В отличие от strpos(), эта функция не
учитывает регистр символов.

Список параметров

haystack

Строка, в которой производится поиск.

needle

Заметьте, что needle может содержать
строку из одного или более символов.

Если needle не является строкой, он приводится
к целому и трактуется как код символа.

offset

Если этот параметр указан, то поиск будет начат с указанного количества символов с начала строки. В отличии от strrpos() и
strripos() данный параметр не может быть отрицательным.

Возвращаемые значения

Возвращает позицию, в которой находится искомая строка, относительно
начала строки haystack (независимо от смещения (offset).
Также обратите внимание на то, что позиция строки отсчитывается от 0, а не от 1.

Возвращает FALSE, если искомая строка не найдена.

Внимание

Эта функция
может возвращать как boolean FALSE, так и не-boolean значение,
которое приводится к FALSE. За более подробной информацией обратитесь к разделу
Булев тип. Используйте оператор === для проверки значения,
возвращаемого этой функцией.

Примеры

Пример #1 Пример использования stripos()


<?php
$findme    
'a';
$mystring1 'xyz';
$mystring2 'ABC';$pos1 stripos($mystring1$findme);
$pos2 stripos($mystring2$findme);// Конечно, 'a' не входит в 'xyz'
if ($pos1 === false) {
    echo 
"Строка '$findme' не найдена в строке '$mystring1'";
}
// Заметьте, что используется ===.  Использование == не даст верного 
// результата, так как 'a' в нулевой позиции.
if ($pos2 !== false) {
    echo 
"Нашел '$findme' в '$mystring2' в позиции $pos2";
}
?>

Примечания

Замечание: Эта функция безопасна
для обработки данных в двоичной форме.

Смотрите также

  • mb_stripos() — Поиск позиции первого вхождения одной строки в другую, нечувствителен к регистру
  • strpos() — Возвращает позицию первого вхождения подстроки
  • strrpos() — Возвращает позицию последнего вхождения подстроки в строке
  • strripos() — Возвращает позицию последнего вхождения подстроки без учета регистра
  • stristr() — Регистронезависимый вариант функции strstr
  • substr() — Возвращает подстроку
  • str_ireplace() — Регистронезависимый вариант функции str_replace

Вернуться к: Обработка строк

Понравилась статья? Поделить с друзьями:
  • Как составить график реализации проекта
  • Приложение как найти вход
  • Десневая улыбка как это исправить
  • Как составить свою игру онлайн
  • Как найти страницу в яндексе с телефона