How to Check if a String Contains Another Substring in PHP
Monty Shokeen Last updated Feb 26, 2021
A lot of times when I am working with strings in PHP, it becomes important to check if a string contains another substring. PHP has a lot of functions to help you manipulate strings any way you like. We will be using some of these functions today to learn how to check if a string contains a specific substring.
Using New Functions in PHP 8
Three new functions have been added in PHP 8 to help us figure out if a string contains another substring. Please keep in mind that all these functions are case sensitive, and checking for the existence of an empty substring with them will always return true .
- str_contains() checks if a string contains a specific substring.
- str_ends_with() checks if a string ends with a specific substring.
- str_starts_with() checks if a string starts with a specific substring.
As I mentioned earlier, these functions perform a case-sensitive match. You can also perform a case-insensitive match with them by first converting both the string and substring to the same case using strtolower() or strtoupper() .
These functions are ideal if you don’t want to get any extra information about the substrings, like their position. People who need extra information about the match should consider using the functions below.
Using strpos() and stripos()
You can use the PHP strpos() function to get the position of the first occurrence of a substring in a string. The function will return false if it cannot find the substring.
When you use strpos() to check for a substring, make sure that you use the strict inequality operator. This is because the position returned by strpos() starts with 0, and 0 can also equate to false . Using a regular equality check will give you false negatives if the substring is right at the beginning of the main string.
Here are some examples of strpos() :
As you can see in the above example, Angela is not at the beginning of our sentence, so it would have a non-zero position which evaluates to true .
On the other hand, Amy is right at the beginning, and its position of 0 evaluates to false, even though it exists in the string. Therefore, always make sure that you evaluate the value of strpos() with !== because there is no way to know where a substring might occur when dealing with strings in real life.
Sometimes, you might need to make this check of a substring in a string case-insensitive. In that case, you can simply use the stripos() function in PHP. It works exactly like strpos() but makes the search case-insensitive.
Using strstr() and stristr()
By default, the strstr() function returns a portion of the main string, starting from the substring and going to the end of the main string. It will return false if the substring does not exist inside the main string.
We can use this information to check the existence of a substring inside a string. All we have to do is evaluate the value returned by strstr() and check if it is false or not. Just like last time, we will be using the strict inequality operator !== to do the check.
Here are some examples:
You can use stristr() in place of strstr() to make the search case-insensitive. All other behavior of stristr() stays the same.
Final Thoughts
In this quick tip, we went over three different ways of checking if a string contains a substring in PHP. You can use any of these functions depending on what information you need from the string. Using the new PHP 8 functions will allow you to skip any type of strict checking, but you will need to use the older functions if you want to know the position of the substring or get a part of the main string as the return value.
str_contains
Выполняет проверку с учётом регистра, указывающую, содержится ли needle в haystack .
Список параметров
Строка для поиска.
Подстрока для поиска в haystack .
Возвращаемые значения
Возвращает true , если needle содержится в haystack , false в противном случае.
Примеры
Пример #1 Пример использования пустой строки ''
Результат выполнения данного примера:
Пример #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() — Выполняет проверку на соответствие регулярному выражению
User Contributed Notes 7 notes
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 ;
>
>
?>
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 ?: «»`;
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
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];
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);
>
// 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 ;
>
>
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
$needle = ‘@’ ;
$haystack = ‘user@example.com’ ;
if (! str_contains ( $haystack , $needle ))<
echo ‘There is not an @ in haystack’ ;
>else<
echo ‘There is an @ in haystack’ ;
>
Изучаем PHP: поиск символа в строке
В этой статье рассматриваются различные методы поиска слова, символа или подстроки в тексте. Описываются преимущества и недостатки каждого метода.
Поиск символа в строке — использование strpos() для регистрозависимого поиска
Простейшим способом проверить, содержит ли строка определённое слово, является использование PHP функции strpos(). Она возвращает позицию первого вхождения подстроки в строке или FALSE, если соответствия не найдены. Поэтому можно сравнить значение, возвращаемое функцией strpos() с FALSE, чтобы проверить наличие подстроки. Пример:
Обратите внимание, что я использовал оператор строгого неравенства (!==). Если искомое слово встречается в начале строки, функция strpos() вернёт 0. Это будет расценено оператором != как значение FALSE. Пример:
При поиске целого слова (например, “на”) функция также вернёт значение TRUE, если строка содержит такие слова, как “она”, “вена” или “например”.
Также можно использовать > -1 вместо !==. Потому что даже если strpos() вернёт 0 как значение индекса, он всё равно будет больше -1. Но помните, что оператор «больше» (>) работает медленнее оператора строгого неравенства (!==).
Поиск символа в строке — использование функции stripos() для регистронезависимого поиска
Для регистрозависимого поиска можно использовать функцию stripos(). Она работает аналогично функции strpos(). Единственное отличие заключается в том, что она игнорирует регистр при поиске подстроки внутри другой строки.
Функция strpos() вернула бы значение FALSE во всех перечисленных выше случаях. Но функция stripos() проигнорировала регистр и вернула значение TRUE.
Другим способом поиска, независящим от регистра, является преобразование всех строк и подстрок в одинаковый регистр, используя функции strtolower() и strtoupper(). Для проверки можно использовать strpos(). Но проще stripos().
Поиск символа в строке — использование регулярных выражений
Также для поиска можно использовать регулярные выражения. Они лучше подходят для случаев, когда вы ищете в строке более сложные конструкции.
Но помните, что функция strpos() работает в три раза быстрее, чем регулярные выражения. Следующий пример демонстрирует, как с их помощью найти слово, символ в строке:
Использование функции preg_match() имеет смысл только при сложном поиске. Например, для проверки того, содержит ли строка слова с десятью и более символами и т.п. Пример:
Чтобы сделать поиск регистронезависимым, добавьте флаг i в конец шаблона. Пример реализации:
Использование регулярных выражений для поиска точного вхождения слова
Функции strpos() и stripos()работают быстрее, чем регулярные выражения. Но их использование для поиска точного вхождения слова может быть проблематичным.
В подобных ситуациях лучше применять регулярные выражения. Можно использовать выражение b в шаблоне регулярного выражения, чтобы обозначить границу слова. Если слово, которое вы ищете, заключено в выражения b, функция preg_match() найдёт только точные вхождения слова и вернет FALSE для частичных совпадений. Вот пример:
Использование strstr() для поиска подстроки
PHP функция strstr() может быть использована для проверки вхождения символа или подстроки. Она возвращает часть исходной строки, начиная с первого вхождения искомого слова и до конца. Функция вернёт значение FALSE, если подстрока не найдена. Благодаря этому можно проверить, содержит ли строка подстроку. Вот пример:
Поиск подстроки в строке в PHP. Проверка строки на символы
В некоторых случаях возникает необходимость найти подстроку в строке, используя встроенные возможности языка программирования PHP. Чтобы решить эту задачу, можно использовать разные инструменты.
Поиск подстроки в строке с помощью strpos
В PHP есть функция под названием strpos , возвращающая позицию 1-го вхождения символа подстроки. Давайте рассмотрим небольшой пример её работы:
Таким образом, PHP-функция возвращает нам или порядковый номер 1-го символа подстроки в исходной строке, или false, если ничего не найдено.
Применяя эту функцию, учтите, что она может вернуть вам в качестве результата 0 — в таком случае можно говорить, что подстрока находится в самом начале нашей исходной строки. Именно поэтому следует применять троекратный знак равно, о котором упомянуто в коде ($pos === false). Это нужно для проверки успешности поиска.
Поиск подстроки в строке с помощью stripos
Эта функция является регистронезависимым аналогом strpos. Она пригодится, если захотите найти последнее вхождение подстроки. Кстати, регистронезависимый вариант есть и у неё — strripos.
Используем для поиска PHP-функцию preg_match
Данная функция позволит выполнить поиск подстроки, задействуя регулярное выражение. Напомним, что регулярное выражение представляет собой шаблон, сравниваемый со строкой. При этом под один шаблон порой подходят сразу много разных строк.
Регулярные выражения пригодятся, если надо выполнять поиск и проверку не по конкретной подстроке, а требуется обнаружить все строки, которые обладают свойствами, описанными посредством регулярных выражений. Вообще, по правде говоря, знание данной темы заметно расширит ваши возможности и облегчит работу со строками.
Остаётся добавить, что язык программирования PHP располагает богатейшим выбором функций для работы с регулярными выражениями. Это раз. Что касается нашей основной темы, то нельзя не сказать, что для работы со строками в PHP тоже есть огромное количество функций, знакомиться с которыми лучше в официальной документации.
Если же хотите прокачать свои навыки PHP-разработки под руководством практикующих экспертов, добро пожаловать на специальный курс в OTUS!