Как сделать str_contains без учета регистра?

У меня много if(mb_stripos($hay, $needle) !== false)в моем коде. Как мне заменить его на str_contains()?

Например, у меня в коде есть вспомогательная функция:

<?php

$str1 = 'Hello world!'; //coming from the database
$str2 = 'hello'; // coming from $_GET user input

function str_contains_old(string $hay, string $needle):bool {
    return mb_stripos($hay, $needle) !== false;
}

var_dump(str_contains_old($str1, $str2)); // gives bool(true)

Как заставить работать с новым str_contains()?

var_dump(str_contains($str1, $str2)); // gives bool(false)

Демо

5 ответов

Просто заранее преобразуйте строку и стог сена в нижний регистр.

      $string = strtolower($originalString);
$haystack = strtolower($originalHaystack);
$isMatched = str_contains($originalHaystack,$originalString);

Вам нужна версия str_contains() без учета регистра. Короткий ответ: ее нет.

Длинный ответ: чувствительность к регистру зависит от кодировки и языкового стандарта. К тому времени, как вы добавили эту информацию в гипотетический str_iconatains(), вы воссоздали mb_stripos(). TL;DR - Не делайте этого.

Лично я сначала перевел бы ввод в нижний регистр, а затем сравнил бы его, поэтому регистр не имеет значения. Это должно работать в большинстве сценариев, если вы не используете специальные символы.

      <?php
function str_icontains($haystack, $needle) {
$smallhaystack = strtolower($haystack);  // make the haystack lowercase, which essentially makes it case insensitive
$smallneedle = strtolower($needle);  // makes the needle lowercase, which essentially makes it case insensitive
if (str_contains($smallhaystack, $smallneedle)) {  // compares the lowercase strings
return 'true';  // returns true (wow)
} else {
return 'false';  // returns false (wow)
}
}

echo str_icontains('HElLo', 'ell'); // true
echo str_icontains('Lorem', 'iPsum'); // false
echo str_icontains('TOBIAGAMESYT', 'bIaG'); // true
?>

Песочница

У меня есть хак.

      if(is_int(stripos("Hello good world", "HELLO"))){
    echo "contains";
}
else{
    echo "not contains";
};

о / п: содержит

Просто используйте strtolower в строке перед вызовом str_contains...

Другие вопросы по тегам