Как сделать 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...