Изучаем PHP: поиск символа в строке
В этой статье рассматриваются различные методы поиска слова, символа или подстроки в тексте. Описываются преимущества и недостатки каждого метода.
- Поиск символа в строке - использование strpos() для регистрозависимого поиска
- Поиск символа в строке - использование функции stripos() для регистронезависимого поиска
- Поиск символа в строке - использование регулярных выражений
- Использование регулярных выражений для поиска точного вхождения слова
- Использование strstr() для поиска подстроки
Поиск символа в строке - использование strpos() для регистрозависимого поиска
Простейшим способом проверить, содержит ли строка определённое слово, является использование PHP функции strpos(). Она возвращает позицию первого вхождения подстроки в строке или FALSE, если соответствия не найдены. Поэтому можно сравнить значение, возвращаемое функцией 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() для регистронезависимого поиска
Для регистрозависимого поиска можно использовать функцию 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 'Слово "синтез" не имеет точных совпадений в данной строке. [Ожидаемый Результат]';
}
Использование strstr() для поиска подстроки
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() для регистронезависимого.