CakeFest 2024: The Official CakePHP Conference

str_contains

(PHP 8)

str_containsОпределяет, содержит ли строка заданную подстроку

Описание

str_contains(string $haystack, string $needle): bool

Выполняет проверку с учётом регистра, указывающую, содержится ли needle в haystack.

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

haystack

Строка для поиска.

needle

Подстрока для поиска в haystack.

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

Возвращает true, если needle содержится в haystack, false в противном случае.

Примеры

Пример #1 Пример использования пустой строки ''

<?php
if (str_contains('абв', '')) {
echo
"Проверка существования пустой строки всегда возвращает true";
}
?>

Результат выполнения приведённого примера:

Проверка существования пустой строки всегда возвращает true

Пример #2 Демонстрация чувствительности к регистру

<?php
$string
= 'ленивая лиса перепрыгнула через забор';

if (
str_contains($string, 'ленивая')) {
echo
"Строка 'ленивая' найдена в проверяемой строке\n";
}

if (
str_contains($string, 'Ленивая')) {
echo
'Строка "Ленивая" найдена в проверяемой строке';
} else {
echo
'"Ленивая" не найдена потому что регистр не совпадает';
}

?>

Результат выполнения приведённого примера:

Строка 'ленивая' найдена в проверяемой строке
"Ленивая" не найдена потому что регистр не совпадает

Примечания

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

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

  • str_ends_with() - Проверяет, заканчивается ли строка заданной подстрокой
  • str_starts_with() - Проверяет, начинается ли строка с заданной подстроки
  • stripos() - Возвращает позицию первого вхождения подстроки без учёта регистра
  • strrpos() - Возвращает позицию последнего вхождения подстроки в строке
  • strripos() - Возвращает позицию последнего вхождения подстроки без учёта регистра
  • strstr() - Находит первое вхождение подстроки
  • strpbrk() - Ищет в строке любой символ из заданного набора
  • substr() - Возвращает подстроку
  • preg_match() - Выполняет проверку на соответствие регулярному выражению

add a note

User Contributed Notes 9 notes

up
104
scm6079
2 years ago
For earlier versions of PHP, you can polyfill the str_contains function using the following snippet:

<?php
// based on original work from the PHP Laravel framework
if (!function_exists('str_contains')) {
function
str_contains($haystack, $needle) {
return
$needle !== '' && mb_strpos($haystack, $needle) !== false;
}
}
?>
up
3
Ancyker
7 months ago
This function doesn't always produce the expected results if you have a needle that isn't UTF-8 but are looking for it in a UTF-8 string. This won't be a concern for most people, but if you are mixing old and new data, especially if reading data from a file, it could be an issue.

Here's a "mb_*"-esque function that searches the string:

<?php
function mb_str_contains(string $haystack, string $needle, $encoding = null) {
return
$needle === '' || mb_substr_count($haystack, $needle, (empty($encoding) ? mb_internal_encoding() : $encoding)) > 0;
}
?>

I used mb_substr_count() instead of mb_strpos() because mb_strpos() will still match partial characters as it's doing a binary search.

We can compare str_contains to the above suggested function:

<?php
// Some Unicode Kanji (漢字はユニコード)
$string = hex2bin('e6bca2e5ad97e381afe383a6e3838be382b3e383bce38389');

// Some Windows-1252 characters (ãƒ)
$contains = hex2bin('e383');
// ^ file_get_contents() produces the same data when it is saved as "ANSI" in Notepad on Windows, so this is not that unrealistic. The only reason to use hex2bin here is to mix character sets without having to use multiple files.

// A character that actually exists in our string. (ー)
$contains2 = hex2bin('e383bc');

echo
" = Haystack: ".var_export($string, true)."\r\n";
echo
" = Needles:\r\n";
echo
" + Windows-1252 characters\r\n";
echo
" - Results:\r\n";
echo
" > str_contains: ".var_export(str_contains($string, $contains), true)."\r\n";
echo
" > mb_str_contains: ".var_export(mb_str_contains($string, $contains), true)."\r\n";
echo
" + Valid UTF-8 character\r\n";
echo
" - Results:\r\n";
echo
" > str_contains: ".var_export(str_contains($string, $contains2), true)."\r\n";
echo
" > mb_str_contains: ".var_export(mb_str_contains($string, $contains2), true)."\r\n";
echo
"\r\n";
?>

Output:

= Haystack: '漢字はユニコード'
= Needles:
+ Windows-1252 characters
- Results:
> str_contains: true
> mb_str_contains: false
+ Valid UTF-8 character
- Results:
> str_contains: true
> mb_str_contains: true

It's not completely foolproof, however. For instance, ド in Windows-1252 will match ド from the above string. So it's still best to convert the encoding of the parameters to be the same first. But, if the character set isn't known/can't be detected and you have no choice but to deal with dirty data, this is probably the simplest solution.
up
14
aisunny7 dot xy at gmail dot com
2 years ago
The polyfill that based on original work from the PHP Laravel framework had a different behavior;

when the $needle is `""` or `null`:
php8's will return `true`;
but, laravel'str_contains will return `false`;

when php8.1, null is deprecated, You can use `$needle ?: ""`;
up
5
harl at gmail dot com
7 months ago
A couple of functions for checking if a string contains any of the strings in an array, or all of the strings in an array:

<?php
function str_contains_any(string $haystack, array $needles): bool
{
return
array_reduce($needles, fn($a, $n) => $a || str_contains($haystack, $n), false);
}

function
str_contains_all(string $haystack, array $needles): bool
{
return
array_reduce($needles, fn($a, $n) => $a && str_contains($haystack, $n), true);
}
?>

str_contains_all() will return true if $needles is an empty array. If you think that's wrong, show me a string in $needles that DOESN'T appear in the $haystack, and then look up "vacuous truth".

(By swapping haystacks and needles in the body of these functions you can create versions that check if a needle appears in any/all of an array of haystacks.)
up
3
olivertasche+nospam at gmail dot com
3 years ago
The code from "me at daz dot co dot uk" will not work if the word is
- at the start of the string
- at the end of the string
- at the end of a sentence (like "the ox." or "is that an ox?")
- in quotes
- and so on.

You should explode the string by whitespace, punctations, ... and check if the resulting array contains your word OR try to test with a RegEx like this:
(^|[\s\W])+word($|[\s\W])+

Disclaimer: The RegEx may need some tweaks
up
1
juliyvchirkov at gmail dot com
2 years ago
<?php

// Polyfill for PHP 4 - PHP 7, safe to utilize with PHP 8

if (!function_exists('str_contains')) {
function
str_contains (string $haystack, string $needle)
{
return empty(
$needle) || strpos($haystack, $needle) !== false;
}
}
up
-2
drupalista dot com dot br at gmail dot com
1 year ago
private function contains(array $needles, string $type, string $haystack = NULL, string $filename = NULL) : bool {
if (empty($needles)) return FALSE;
if ($filename)
$haystack = file_get_contents($filename);

$now_what = function(string $needle) use ($haystack, $type) : array {
$has_needle = str_contains($haystack, $needle);
if ($type === 'any' && $has_needle)
return ['done' => TRUE, 'return' => TRUE];

if ($type === 'all' && !$has_needle)
return ['done' => TRUE, 'return' => FALSE];

return ['done' => FALSE];
};

foreach ($needles as $needle) {
$check = $now_what($needle);
if ($check['done'])
return $check['return'];
}
return TRUE;
}

function containsAny(array $needles, string $haystack = NULL, string $filename = NULL) : bool {
return self::contains($needles, 'any', $haystack, $filename);
}

function containsAll(array $needles, string $haystack = NULL, string $filename = NULL) : bool {
return self::contains($needles, 'all', $haystack, $filename);
}
up
-11
AuxData
2 years ago
Until PHP 8 was released, many-a-programmer were writing our own contain() functions. Mine also handles needles with logical ORs (set to '||').
Here it is.

function contains($haystack, $needle, $offset){
$OR = '||';
$result = false;

$ORpos = strpos($needle, $OR, 0);
if($ORpos !== false){ //ORs exist in the needle string
$needle_arr = explode($OR, $needle);
for($i=0; $i < count($needle_arr); $i++){
$pos = strpos($haystack, trim($needle_arr[$i]), $offset);
if($pos !== false){
$result = true;
break;
}
}
} else {
$pos = strpos($haystack, trim($needle), $offset);
if($pos !== false){
$result = true;
}
}
return($result);
}

Call: contains("Apple Orange Banana", "Apple || Walnut", 0);
Returns: true
up
-48
kadenskinner at gmail dot com
3 years ago
<?php

$needle
= '@';
$haystack = 'user@example.com';

if (!
str_contains($haystack, $needle)){
echo
'There is not an @ in haystack';
}else{
echo
'There is an @ in haystack';
}
To Top