Поиск символа в строке PHP с помощью strpos, preg_match и strstr
В этой статье рассматриваются различные методы поиска слова, символа или подстроки в тексте. Описываются преимущества и недостатки каждого метода.
- Поиск символа в строке — использование strpos() для регистрозависимого поиска
- Поиск символа в строке — использование функции stripos() для регистронезависимого поиска
- Поиск символа в строке — использование регулярных выражений
- Использование регулярных выражений для поиска точного вхождения слова
- Использование strstr() для поиска подстроки
Простейшим способом проверить, содержит ли строка определённое слово, является использование PHP функции strpos(). Она возвращает позицию первого вхождения подстроки в строке или FALSE, если соответствия не найдены.
$the_string = "Я на 5 лет старше тебя."; $the_word = "лет"; $the_character = "Я"; $the_substring = "5 лет"; // Вывод — Слово "лет" есть в данной строке. if (strpos($the_string, $the_word) !== false) { echo 'Слово "'.$the_word.'" есть в данной строке.'; } // Вывод — Символ "Я" есть в данной строке. if (strpos($the_string, $the_character) !== false) { echo ' Символ "'.$the_character.'" есть в данной строке.'; } // Вывод — Подстрока "5 лет" есть в данной строке. if (strpos($the_string, $the_substring) !== false) { echo 'Подстрока "'.$the_substring.'" есть в данной строке.'; }
Обратите внимание, что я использовал оператор строгого неравенства (!==). Если искомое слово встречается в начале строки, функция strpos() вернёт 0. Это будет расценено оператором != как значение FALSE. Пример:
// Вывод — Символа "Я" нет в данной строке. if (strpos($the_string, $the_character) != false) { echo 'Символ "'. $the_character.'" есть в данной строке.'; } else { echo 'Символа "'.$the_character.'" нет в данной строке.'; }
При поиске целого слова (например, “на”) функция также вернёт значение TRUE, если строка содержит такие слова, как “она”, “вена” или “например”.
Также можно использовать > -1 вместо !==. Потому что даже если strpos() вернёт 0 как значение индекса, он всё равно будет больше -1. Но помните, что оператор «больше» (>) работает медленнее оператора строгого неравенства (!==).
Для регистрозависимого поиска можно использовать функцию stripos(). Она работает аналогично функции strpos(). Единственное отличие заключается в том, что она игнорирует регистр при поиске подстроки внутри другой строки.
$the_string = "Ваня любит и яблоки, и апельсины."; $the_word = "ваня"; $the_character = "Я"; $the_substring = "ЛЮбИт И"; // Вывод — Слово "ваня" есть в данной строке. if (stripos($the_string, $the_word) !== false) { echo 'Слово "'.$the_word.'" есть в данной строке.'; } // Вывод — Символ "Я" есть в данной строке. if (stripos($the_string, $the_character) !== false) { echo 'Символ "'.$the_character.'" есть в данной строке.'; } // Вывод — Подстрока "ЛЮбИт И" есть в данной строке. if (stripos($the_string, $the_substring) !== false) { echo 'Подстрока "'.$the_substring.'" есть в данной строке.'; }
Функция strpos() вернула бы значение FALSE во всех перечисленных выше случаях. Но функция stripos() проигнорировала регистр и вернула значение TRUE.
Другим способом поиска, независящим от регистра, является преобразование всех строк и подстрок в одинаковый регистр, используя функции strtolower() и strtoupper(). Для проверки можно использовать strpos(). Но проще stripos().
Также для поиска можно использовать регулярные выражения. Они лучше подходят для случаев, когда вы ищете в строке более сложные конструкции.
Но помните, что функция strpos() работает в три раза быстрее, чем регулярные выражения. Следующий пример демонстрирует, как с их помощью найти слово, символ в строке:
$the_string = "Я на 5 лет старше тебя. "; $the_word = "лет"; $the_character = "Я"; $the_substring = "5 лет"; // Вывод — Слово "лет" есть в данной строке. if (preg_match('/лет/', $the_string)) { echo 'Слово "'.$the_word.'" есть в данной строке.'; } // Вывод — Символ "Я" есть в данной строке. if (preg_match('/Я/', $the_string)) { echo 'Символ "'.$the_character.'" есть в данной строке.'; } // Вывод — Подстрока "5 лет" есть в данной строке. if (preg_match('/5 лет/', $the_string)) { echo 'Подстрока "'.$the_substring.'" есть в данной строке.'; }
Использование функции preg_match() имеет смысл только при сложном поиске. Например, для проверки того, содержит ли строка слова с десятью и более символами и т.п. Пример:
$the_string = 'Фотосинтез и рискованный – длинные слова.'; // Вывод — Данная строка содержит слова из 10 и более символов. if (preg_match('/w{10,}/i', $the_string)) { echo 'Данная строка содержит слова из 10 и более символов.'; }
Чтобы сделать поиск регистронезависимым, добавьте флаг i в конец шаблона. Пример реализации:
$the_string = "Ваня любит и яблоки, и апельсины."; $the_word = "ваня"; $the_character = "Я"; $the_substring = "ЛЮбИт И"; // Вывод — Слово "ваня" есть в данной строке. if (preg_match('/ваня/i', $the_string)) { echo 'Слово "'.$the_word.'" есть в данной строке.'; } // Вывод — Символ "Я" есть в данной строке. if (preg_match('/Я/i', $the_string)) { echo 'Символ "'.$the_character.'" есть в данной строке.'; } // Вывод — Подстрока "ЛЮбИт И" есть в данной строке. if (preg_match('/ЛЮбИт И/i', $the_string)) { echo 'Подстрока "'.$the_substring.'" есть в данной строке.'; }
Функции strpos() и stripos()работают быстрее, чем регулярные выражения. Но их использование для поиска точного вхождения слова может быть проблематичным.
В подобных ситуациях лучше применять регулярные выражения. Можно использовать выражение b в шаблоне регулярного выражения, чтобы обозначить границу слова. Если слово, которое вы ищете, заключено в выражения b, функция preg_match() найдёт только точные вхождения слова и вернет FALSE для частичных совпадений.
$the_string = 'Фотосинтез и рискованный – длинные слова.'; $the_word = 'синтез'; // Вывод — Слово "синтез" имеет точное совпадение в данной строке. [ЛОЖНО положительный] if (preg_match('/синтез/', $the_string)) { echo 'Слово "синтез" имеет точное совпадение в данной строке. [ЛОЖНО положительный]'; } // Вывод — Слово "синтез" имеет точное совпадение в данной строке. [ЛОЖНО положительный] if (strpos($the_string, $the_word)) { echo 'Слово "синтез" имеет точное совпадение в данной строке. [ЛОЖНО положительный]'; } // Вывод — Слово "синтез" не имеет точных совпадений в данной строке. [Ожидаемый Результат] if (preg_match('/bсинтезb/', $the_string)) { echo 'Слово "синтез" имеет точное совпадение в данной строке. [ЛОЖНО положительный]'; } else { echo 'Слово "синтез" не имеет точных совпадений в данной строке. [Ожидаемый Результат]'; }
PHP функция strstr() может быть использована для проверки вхождения символа или подстроки. Она возвращает часть исходной строки, начиная с первого вхождения искомого слова и до конца. Функция вернёт значение FALSE, если подстрока не найдена. Благодаря этому можно проверить, содержит ли строка подстроку. Вот пример:
$the_string = "Я на 5 лет старше тебя."; $the_word = "лет"; $the_character = "Я"; $the_substring = "5 лет"; // Вывод — Слово "лет" есть в данной строке. if (strstr($the_string, $the_word) !== false) { echo 'Слово "'.$the_word.'" есть в данной строке.'; } // Вывод — Символ "Я" есть в данной строке. if (strstr($the_string, $the_character) !== false) { echo 'Символ "'.$the_character.'" есть в данной строке.'; } // Вывод — Подстрока "5 лет" есть в данной строке. if (strstr($the_string, $the_substring) !== false) { echo 'Подстрока "'.$the_substring.'" есть в данной строке.'; }
Для регистронезависимого поиска используйте функцию stristr().
Краткое резюме
- Лучший метод поиска символа или слова в строке – PHP функции strpos(). Если нужно провести регистронезависимый поиск, применяйтеstripos(). Обе функции просты в использовании и работают быстрее остальных методов.
- Для сложного поиска используйте регулярные выражения. Вы также можете применять их для простого поиска, но они работают медленнее, чем функция strpos().
- Регулярные выражения полезны, когда вы ищете точное вхождение слова. Например, при поиске слова “сто” функция strpos() также вернёт значение TRUE, если строка содержит слово “Место”. С другой стороны, можно использовать выражение b в функции preg_match(), которая в таком случае возвратит FALSE.
- Используйте strstr() для регистрозависимого поиска и stristr() для регистронезависимого.
Дайте знать, что вы думаете по данной теме статьи в комментариях. Мы очень благодарим вас за ваши комментарии, отклики, дизлайки, подписки, лайки!
Сергей Бензенкоавтор-переводчик статьи «Best way to check if a string contains a specific word or substring in PHP»
Поиск строки в строке PHP: описание возможностей — RUUD
09-06-2018 12:02
Содержание статьи:
- Основные функциональные возможности поиска
- Особенности стандартного подхода
- Стандартные функции в нестандартных решениях
PHP предлагает использовать различные варианты поиска строк в других строках. Есть обычные функции. Есть возможность использования регулярных выражений. Разработчик может разработать собственный вариант поиска информации при соблюдении правил синтаксиса.
Поиск строк не ограничивается фактом подтверждения наличия нужного символа или строки в нужном месте. Строкой может выступать объект — это более емкое информационное понятие, чем просто строка. Поиск особенно эффективен, когда момент обнаружения сопровождается немедленным принятием решения, а не требует дополнительной обработки.
Основные функциональные возможности поиска
Вам будет интересно:Captcha PHP: пример скрипта
Поиск строки в строке PHP — функция strpos(). Ее результат — или булевое значение, или позиция вхождения искомого (второй параметр) в строке (первый параметр) с позиции (третий параметр). Если последний параметр не задан, поиск выполняется с нулевой позиции строки.
В данном примере PHP-поиск в строке показан на примере одиночного символа. Вместо символа можно использовать строку. PHP не ограничивает программиста в размерах строк, но разумные пределы имеют существенное значение.
Искать строки в строках можно с учетом регистра, с первого или последнего вхождения и использовать регулярные выражения. Как и во всех остальных случаях, существенное значение имеет кодировка страницы, на которой находится скрипт.
В некоторых случаях целесообразно использовать вариант iconv_strpos(), а не просто strpos(). В подавляющем большинстве случаев поиск подстроки в строке PHP обеспечит идеально точно: достаточно держать кодировку страницы и строки в одной кодировке.
Особенности стандартного подхода
Если поиск подстроки в строке PHP не имеет результата: искомого нет, и результат будет логическим значением. Однако если искомая подстрока начинается с нулевой позиции, то это следует выделить особо в операциях сравнения и анализа результата. Когда результат равен 0 — это ненамного отстоит дальше от результата false.
В отличие от JavaScript, в отношении строк PHP более консервативен, и для него по сей день строки — это строки. Работа с ними — это строчные функции: от простых уровня strpos до сложных, использующих регулярные выражения.
Искать нужно, чтобы:
- принять решение о направлении алгоритма;
- заменить искомое на другое;
- проверить событие;
- увеличить счетчик статистики и пр.
Это привычная логика алгоритма, JavaScript пошел дальше и признал «строки» объектами. Но одного признания на практике мало. Если абстрагироваться от понятия «строка» и понимать под ним реальный объект, вопрос «поиск строки в строке» PHP позволит сформулировать в контексте реального метода, например, яблоко может быть спелым, не только когда оно красное.
Классический поиск слова «красное» в описании яблока не есть гарантия достоверного ответа о спелости фрукта. Если яблоко представлено не строкой, а объектом, то поиск строки в строке PHP выполнит не как strpos, а как метод реального объекта. При этом нет никакой гарантии, что в теле метода будет использоваться именно функция strpos.
Стандартные функции в нестандартных решениях
Характерная черта привычной обработки информации (человеком): позиция, где что находится, имеет значение, когда именно она является целью или решением. Во всех остальных случаях не важно, где что присутствует, важно, что оно обозначено и является основанием для дальнейших действий.
Косвенно поиск строки в строке PHP выполняет в функциях trim, str_replace и других. Интересный вариант поиска доступен при совместном применении explode/implode и манипулировании массивами.
Если использовать всю функциональность PHP, поиск в строке легко приобретает семантику, выходит за рамки привычного синтаксиса и становится причиной для обретения реального смысла. Манипулирование смыслом для человека привычнее, для алгоритма безопаснее, а трансформация строк в объекты — это как переход от машинных кодов в мир современных языков программирования.
Источник
Автор: Нина Чернышова
Похожие статьи
«Система «Виндовс» защитила ваш компьютер»: как отключить появление этого сообщения? Простейшие методы
Ошибка статуса VPN в «Хамачи»: способы быстрого решения проблемы
Как сделать рассылку в «Вайбере»: подробная инструкция и способы
Как сделать бизнес-аккаунт в «Фейсбук»: создание, настройка и раскрутка
Как восстановить переписку в «Телеграмме»: пошаговая инструкция, советы
Как получить в «ES Проводник» Root-права?
Как отключить «Протект» в «Яндекс. Браузере» на компьютере?
Как сохранять контакты в «Гугл»: простые способы, правила переноса, рекомендации и советы
Как на «Андроиде» переименовать приложение: подробная инструкция
Продукты «Гугла»: список, функции и возможности, отзывы
php — Как проверить, содержит ли строка определенное слово?
Вы можете использовать регулярные выражения, поскольку они лучше подходят для сопоставления слов по сравнению с strpos
, как упоминалось другими пользователями. Проверка strpos
для is
также вернет true для таких строк, как: fare, care, stare и т. д. Этих непреднамеренных совпадений можно просто избежать в регулярном выражении, используя границы слов.
Простое сопоставление и
может выглядеть примерно так:
$a = 'Как дела?'; если (preg_match('/\bare\b/', $a)) { эхо "истина"; }
С точки зрения производительности strpos
примерно в три раза быстрее. Когда я сделал один миллион сравнений одновременно, preg_match
заняло 1,5 секунды, а для strpos
потребовалось 0,5 секунды.
Редактировать: Для поиска любой части строки, а не только слово за словом, я бы рекомендовал использовать регулярное выражение, например
$a = 'Как дела?'; $search = 'у'; if(preg_match("/{$search}/i", $a)) { эхо "истина"; }
i
в конце регулярного выражения делает регулярное выражение нечувствительным к регистру. Если вы этого не хотите, вы можете его не указывать.
Теперь это может быть довольно проблематично в некоторых случаях, так как строка $search никоим образом не дезинфицирована, я имею в виду, что в некоторых случаях она может не пройти проверку, как если бы $search
был пользовательским вводом, который они могут добавить некоторая строка, которая может вести себя как какое-то другое регулярное выражение…
Кроме того, вот отличный инструмент для тестирования и просмотра объяснений различных регулярных выражений Regex101
Чтобы объединить оба набора функций в одну многоцелевую функцию (в том числе с выбираемой чувствительностью к регистру), вы можете использовать что-то вроде этого:
function FindString($needle,$haystack,$i,$word) { // $i должно быть "" или "i" для нечувствительности к регистру если (strtoupper($word)=="W") { // если $word равно "W", то поиск по слову вместо строки при поиске по строке. если (preg_match("/\b{$иглы}\b/{$i}", $стог сена)) { вернуть истину; } } еще { если(preg_match("/{$иглы}/{$i}", $стог сена)) { вернуть истину; } } вернуть ложь; // Поместите кавычки вокруг значений true и false выше, чтобы вернуть их в виде строк, а не в виде логических значений/целых чисел. }
Еще одна вещь, которую следует иметь в виду, это то, что \b
не будет работать на других языках, кроме английского.
Объяснение этому и решение взято отсюда:
\b
представляет собой начало или конец слова (граница слова). Этот регулярное выражение будет соответствовать яблоку в яблочном пироге, но не будет соответствовать яблоку в ананасовые, яблочные тележки или пекарские яблоки.Как насчет «кафе»? Как мы можем извлечь слово «кафе» в регулярном выражении? На самом деле, \bcafé\b не работало бы. Почему? Потому что «кафе» содержит не-ASCII-символ: é. \b нельзя просто использовать с Unicode, например समुद्र, 감사, месяц и 😉 . 9)’ . $ слово . ‘(?=[\s,.:;»\’]|$)/’, $str)) вернуть истину; } вернуть ложь; }
Начиная с PHP 8.0.0 теперь можно использовать str_contains
Строка PHP содержит | Функция PHP str_contains с примером
Сводка: В этом руководстве мы узнаем, как проверять, содержится ли строка в другой строке. Для проверки наличия строки php используется функция PHP str_contains.
Обзор Строка PHP содержит
- str_contains используется для определения, содержит ли строка заданную подстроку.
- str_contains проверяет, содержится ли строка в другой строке, и возвращает логическое значение, такое как значение true и false, независимо от того, была ли строка найдена.
Типичный способ проверки наличия одной строки в другой обычно выполняется с помощью функций PHP strpos или strstr . в результате эта функция является таким распространенным вариантом использования почти в каждом проекте, более того, она заслуживает отдельной специальной функции: str_contains .
Перепрофилирование strpos и strstr для этого варианта использования имеет некоторые недостатки. Либо они:
- не очень понятные для читателя
- легко ошибиться (особенно при сравнении !==) или трудно запомнить начинающим PHP-разработчикам.
Из-за этого несколько фреймворков PHP предоставляют вспомогательную функцию для такого поведения, потому что оно очень распространено. кроме того, это очень хорошо указывает на важность и необходимость.
Синтаксис:
str_contains (строка $haystack, строка $needle) : bool
.
Примечание: str_contains принимает в качестве аргументов $haystack и $needle, проверяет, находится ли $needle в $haystack, и возвращает логическое значение, такое как true/false, независимо от того, была ли найдена $needle.
Возвращаемые значения
Эта функция является двоично-безопасной.Возвращает true, если игла находится в стоге сена, иначе false.
Пример строки PHP, содержащей
Случай 1: использование пустой строки
''
if (str_contains('abc', '')) {
echo "To Проверка существования пустой строки всегда возвращает истину";
}
?>
Вывод: от до Проверка наличия пустой строки всегда будет возвращать истинное значение
Случай 2: Отображение с учетом регистра