Поиск подстроки в строке в PHP. Проверка строки на символы
В некоторых случаях возникает необходимость найти подстроку в строке, используя встроенные возможности языка программирования PHP. Чтобы решить эту задачу, можно использовать разные инструменты.
Поиск подстроки в строке с помощью strpos
В PHP есть функция под названием strpos , возвращающая позицию 1-го вхождения символа подстроки. Давайте рассмотрим небольшой пример её работы:
Таким образом, PHP-функция возвращает нам или порядковый номер 1-го символа подстроки в исходной строке, или false, если ничего не найдено.
Применяя эту функцию, учтите, что она может вернуть вам в качестве результата 0 — в таком случае можно говорить, что подстрока находится в самом начале нашей исходной строки. Именно поэтому следует применять троекратный знак равно, о котором упомянуто в коде ($pos === false). Это нужно для проверки успешности поиска.
Поиск подстроки в строке с помощью stripos
Эта функция является регистронезависимым аналогом strpos. Она пригодится, если захотите найти последнее вхождение подстроки. Кстати, регистронезависимый вариант есть и у неё — strripos.
Используем для поиска PHP-функцию preg_match
Данная функция позволит выполнить поиск подстроки, задействуя регулярное выражение. Напомним, что регулярное выражение представляет собой шаблон, сравниваемый со строкой. При этом под один шаблон порой подходят сразу много разных строк.
Регулярные выражения пригодятся, если надо выполнять поиск и проверку не по конкретной подстроке, а требуется обнаружить все строки, которые обладают свойствами, описанными посредством регулярных выражений. Вообще, по правде говоря, знание данной темы заметно расширит ваши возможности и облегчит работу со строками.
Остаётся добавить, что язык программирования PHP располагает богатейшим выбором функций для работы с регулярными выражениями. Это раз. Что касается нашей основной темы, то нельзя не сказать, что для работы со строками в PHP тоже есть огромное количество функций, знакомиться с которыми лучше в официальной документации.
Если же хотите прокачать свои навыки PHP-разработки под руководством практикующих экспертов, добро пожаловать на специальный курс в OTUS!
strstr
Возвращает подстроку строки haystack , начиная с первого вхождения needle (и включая его) и до конца строки haystack .
Замечание:
Эта функция учитывает регистр символов. Для поиска без учёта регистра используйте stristr() .
Замечание:
Если нужно лишь определить, встречается ли подстрока needle в haystack , используйте более быструю и менее ресурсоёмкую функцию strpos() .
Список параметров
До PHP 8.0.0, если параметр needle не является строкой, он преобразуется в целое число и трактуется как код символа. Это поведение устарело с PHP 7.3.0, и полагаться на него крайне не рекомендуется. В зависимости от предполагаемого поведения, параметр needle должен быть либо явно приведён к строке, либо должен быть выполнен явный вызов chr() .
Если установлен в true , strstr() возвращает часть строки haystack до первого вхождения needle (исключая needle).
Возвращаемые значения
Возвращает часть строки или false , если needle не найдена.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 | Передача целого числа ( int ) в needle больше не поддерживается. |
| 7.3.0 | Передача целого числа ( int ) в needle объявлена устаревшей. |
Примеры
Пример #1 Пример использования strstr()
<?php
$email = ‘name@example.com’ ;
$domain = strstr ( $email , ‘@’ );
echo $domain ; // выводит @example.com
$user = strstr ( $email , ‘@’ , true );
echo $user ; // выводит name
?>
Смотрите также
- stristr() — Регистронезависимый вариант функции strstr
- strrchr() — Находит последнее вхождение символа в строке
- strpos() — Возвращает позицию первого вхождения подстроки
- strpbrk() — Ищет в строке любой символ из заданного набора
- preg_match() — Выполняет проверку на соответствие регулярному выражению
User Contributed Notes 10 notes
strstr() is not a way to avoid type-checking with strpos().
If $needle is the last character in $haystack, and testing $needle as a boolean by itself would evaluate to false, then testing strstr() as a boolean will evaluate to false (because, if successful, strstr() returns the first occurrence of $needle along with the rest of $haystack).
<?php
findZero ( ‘01234’ ); // found a zero
findZero ( ‘43210’ ); // did not find a zero
findZero ( ‘0’ ); // did not find a zero
findZero ( ’00’ ); // found a zero
findZero ( ‘000’ ); // found a zero
findZero ( ’10’ ); // did not find a zero
findZero ( ‘100’ ); // found a zero
function findZero ( $numberString ) <
if ( strstr ( $numberString , ‘0’ )) <
echo ‘found a zero’ ;
> else <
echo ‘did not find a zero’ ;
>
>
?>
Also, strstr() is far more memory-intensive than strpos(), especially with longer strings as your $haystack, so if you are not interested in the substring that strstr() returns, you shouldn’t be using it anyway.
There is no PHP function just to check only _if_ $needle occurs in $haystack; strpos() tells you if it _doesn’t_ by returning false, but, if it does occur, it tells you _where_ it occurs as an integer, which is 0 (zero) if $needle is the first part of $haystack, which is why testing if (strpos($needle, $haystack)===false) is the only way to know for sure if $needle is not part of $haystack.
My advice is to start loving type checking immediately, and to familiarize yourself with the return value of the functions you are using.
Been using this for years:
<?php
/**
*
* @author : Dennis T Kaplan
*
* @version : 1.0
* Date : June 17, 2007
* Function : reverse strstr()
* Purpose : Returns part of haystack string from start to the first occurrence of needle
* $haystack = ‘this/that/whatever’;
* $result = rstrstr($haystack, ‘/’)
* $result == this
*
* @access public
* @param string $haystack, string $needle
* @return string
**/
function rstrstr ( $haystack , $needle )
<
return substr ( $haystack , 0 , strpos ( $haystack , $needle ));
>
?>
You could change it to:
rstrstr ( string $haystack , mixed $needle [, int $start] )
<?php
function rstrstr ( $haystack , $needle , $start = 0 )
<
return substr ( $haystack , $start , strpos ( $haystack , $needle ));
>
PHP: строки
![]()
Строки с одинарными кавычками обрабатываются почти буквально. Строки с двойными кавычками заменяют переменные на их значения, а также особым образом интерпретируют определенные последовательности символов.
Искусственных ограничений на длину строки не существует. В пределах доступной памяти вы можете создавать строки произвольно выбранной длины.
Строки, разделенные двойными кавычками (как “эта”), предварительно обрабатываются PHP двумя способами:
- Определенные последовательности символов, начинающиеся с обратной косой черты (\), заменяются специальными символами.
- Имена переменных (начинающиеся с $) заменяются строковыми представлениями их значений.
Замена последовательности символов осуществляется следующим образом:
- \n заменяется символом новой строки;
- \r заменяется символом возврата каретки;
- \t заменяется символом табуляции;
- \$ заменяется знаком доллара ($);
- \” заменяется одинарной двойной кавычкой (“);
- \\ заменяется одним обратным слешем (\).
Оператор конкатенации (объединения) строк
Чтобы объединить две строковые переменные вместе, используется оператор-точка ( . ):
В приведенным выше коде два раза использовался оператор конкатенации. Это связано с необходимостью вставить третью строку.
Между двумя строковыми переменными мы добавили строку с одним символом, пустым пробелом, чтобы разделить две переменные.
Функция strlen()
Функция strlen() используется для нахождения длины строки.
Найдем длину строки “Hello world!”.
Это приведет к следующему результату:
Длина строки часто используется в циклах или других функциях, если важно знать, когда заканчивается строка (например, при необходимости остановить цикл после последнего символа в строке).
Функция strpos()
Функция strpos() используется для поиска строки или символа в строке.
Если в строке найдено совпадение, функция возвращает позицию первого совпадения. Если совпадение не найдено, она вернет FALSE.
Попробуем найти строку “world” в строке “Hello world!”
Это даст следующий результат:
Как видите, позиция строки “world” в нашей строке — 6. Причина того, что это 6, а не 7, заключается в том, что первая позиция в строке равна 0, а не 1.
strpos
Ищет позицию первого вхождения подстроки needle в строку haystack .
Список параметров
Строка, в которой производится поиск
Если needle не является строкой, он приводится к целому и трактуется как код символа.
Если этот параметр указан, то поиск будет начат с указанного количества символов с начала строки. В отличии от strrpos() и strripos() данный параметр не может быть отрицательным.
Возвращаемые значения
Возвращает позицию, в которой находится искомая строка, относительно начала строки haystack (независимо от смещения (offset). Также обратите внимание на то, что позиция строки отсчитывается от 0, а не от 1.
Возвращает FALSE , если искомая строка не найдена.
Эта функция может возвращать как boolean FALSE , так и не-boolean значение, которое приводится к FALSE . За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.
Примеры
Пример #1 Использование ===
<?php
$mystring = ‘abc’ ;
$findme = ‘a’ ;
$pos = strpos ( $mystring , $findme );
// Заметьте, что используется ===. Использование == не даст верного
// результата, так как ‘a’ находится в нулевой позиции.
if ( $pos === false ) <
echo «Строка ‘ $findme ‘ не найдена в строке ‘ $mystring ‘» ;
> else <
echo «Строка ‘ $findme ‘ найдена в строке ‘ $mystring ‘» ;
echo » в позиции $pos » ;
>
?>
Пример #2 Использование !==
<?php
$mystring = ‘abc’ ;
$findme = ‘a’ ;
$pos = strpos ( $mystring , $findme );
// Оператор !== также можно использовать. Использование != не даст верного
// результата, так как ‘a’ находится в нулевой позиции. Выражение (0 != false) приводится
// к false.
if ( $pos !== false ) <
echo «Строка ‘ $findme ‘ найдена в строке ‘ $mystring ‘» ;
echo » в позиции $pos » ;
> else <
echo «Строка ‘ $findme ‘ не найдена в строке ‘ $mystring ‘» ;
>
?>
Пример #3 Использование смещения
Примечания
Замечание: Эта функция безопасна для обработки данных в двоичной форме.