Поиск символа в строке PHP с помощью strpos, preg_match и strstr
В этой статье рассматриваются различные методы поиска слова, символа или подстроки в тексте. Описываются преимущества и недостатки каждого метода.
Простейшим способом проверить, содержит ли строка определённое слово, является использование 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(). Она работает аналогично функции 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» , подготовленная редакцией проекта.
chr | Возвращает символ по его коду ASCII |
chunk_split | Разбивает строку на подстроки заданной длины |
crypt | Зашифровывает строку с использованием одного из алгоритмов |
echo | Выводит одну или несколько строк |
explode | Разбивает строку на подстроки, ограниченные заданным разделителем, и форматирует из них массив |
html_entity_decode | Декодирует все HTML-представления в соответствующие символы. Функция обратно по отношению к htmlentites |
htmlentites | Кодирует все специальные символы в их HTML-представление |
htmlspecialchars | Кодирует все символы в их HTML-представление |
implode | Формирует строку из элементов массива |
ltrim | Удаляет начальные пробелы из строки |
rtrim | Удаляет конечные пробелы из строки |
number_format | Представляет число в виде строки в различных форматах |
ord | Возвращает ASCII-код символа |
parse_str | Разбивает строку URL и присваивает значение переменным |
Выводит строку | |
printf | Выводит строку с форматированием |
sprintf | Возвращает строку с форматированием |
setlocale | Устанавливает информацию о кодовой странице |
similar_text | Вычисляет степень похожести двух строк |
sscanf | Разбивает строку по шаблону и присваивает полученные значения переменным |
str_ireplace | То же самое, что и str_replace, но без учета различий в регистре символов |
str_pad | Дополняет строку до заданной длины другой строкой |
str_repeat | Повторяет строку заданное количество раз |
str_replace | Ищет в строке все вхождения подстроки и меняет на заданную строку |
str_shuffle | Случайным образом перемешивает все символы в строке |
str_split | Формирует массив из символов строки |
str_word_count | Подсчитывает количество слов в строке |
strcasecmp | Выполняет побайтовое сравнение строк без учета регистра символов |
strcht | То же самое что strstr |
strcmp | Выполняет побайтовое сравнение строк с учетом регистра символов |
strip_tags | Удаляет из строки все HTML-и PHP-теги |
stripos | Ищет первое вхождение подстроки в строке без учета регистра символов |
stristr | То же самое что strstr, но без учета регистра символов |
strlen | Возвращает длину строки |
strnatcasecmp | То же самое что strnatcmp, но без учета регистра символов |
strncmp | Выполняет побайтовое сравнение первых n символов строк |
strpos | Ищет первое вхождение подстроки в строке |
strrchr | Ищет последнее вхождение символа в строке |
strrev | Инвертирует строку — прочитывает ее справа налево |
strripos | Ищет последнее вхождение подстроки в строке без учета регистра символов |
strrpos | Ищет последнее вхождение подстроки в строке |
strspn | Возвращает длину участка строки, состоящего из заданных символов |
strstr | Возвращает часть строки от первого вхождения подстроки до конца |
strtolower | Преобразует прописные буквы в строчные |
strtoupper | Преобразует строчные буквы в прописные |
strtr | Преобразует заданные символы в строке |
substr_compare | Сравнивает две строки, начиная с заданного смещения |
substr_count | Подсчитывает, сколько раз заданная подстрока встречается в строке |
substr_replace | Ищет в заданном участке строки все вхождения подстроки и меняет на другую строку |
substr | Возвращает заданную часть исходной строки |
trim | Удаляет начальные и конечные пробелы из строки |
ucfirst | Преобразует первую букву строки в прописную |
Строки.
Конкатенация, обработка переменных в строках
Значениями типа string
являются текстовые строки (кратко строки). Строка — это последовательность из нуля или более символов. Символы включают в себя буквы, цифры, знаки пунктуации, специальные символы и пробелы.
Строка может быть определена четырьмя различными способами:
- двойными кавычками
- одинарными кавычками
- heredoc-синтаксисом
- nowdoc-синтаксисом
Строка в двойных кавычках
Строка в двойных кавычках:
$str = "Строка"; echo "Одну большую строку можно разбить на несколько маленьких строк, чтобы её было удобнее читать.";
В строках с двойными кавычками можно использовать управляющие последовательности. Управляющая последовательность — это специальные символы предназначенные для форматирования текстового вывода. В PHP доступны следующие управляющие последовательности:
Последовательность | Значение |
---|---|
\n | Перевод на новую строку (шестнадцатеричный код 0A). |
\t | Горизонтальная табуляция (шестнадцатеричный код 09). |
\\ | Обратная косая черта (обратный слэш). |
\$ | Знак доллара. |
\" | Двойная кавычка. |
\xXX | Символ, заданный одной или двумя шестнадцатеричными цифрами. |
Основным свойством строк в двойных кавычках является возможность обработки переменных внутри строк.
$num = 10; echo "Число: $num <br> Знак доллара: \$";
Строки, заключённые в двойные кавычки, могут содержать символы одинарных кавычек:
echo "Одинарная кавычка: '";
Строка в одинарных кавычках (апострофах)
Строка в одинарных кавычках:
$str = 'Строка'; echo 'Одну большую строку можно разбить на несколько маленьких строк, чтобы её было удобнее читать. ';
В отличие от строк в двойных кавычках и heredoc-синтаксиса, переменные и управляющие последовательности (за одним исключением), заключённые в одинарные кавычки, не обрабатываются. Это означает, что они будут интерпретированы как обычные символы строки:
$num = 10; echo 'Число: $num <br> Знак доллара: \$';
Чтобы в строке, заключённой в одинарные кавычки, можно было использовать одинарные кавычки, нужно их экранировать с помощью обратного слэша (\'
). Если необходимо написать саму обратную косую черту, нужно продублировать её (\\
):
echo 'Внутри используются \'одинарные\' кавычки'; echo 'Обратный слэш: \\';
Строки, заключённые в одинарные кавычки, могут содержать символы двойных кавычек:
echo 'Двойная кавычка: "';
Heredoc-синтаксис
Heredoc-синтаксис — это альтернативный способ записи строк.
Строка, определяемая с помощью Heredoc-синтаксиса, работает также, как и строка, расположенная в двойных кавычках. Разница между Heredoc и строкой в двойных кавычках заключается в том, что используя Heredoc нет необходимости экранировать двойные кавычки.
Heredoc-синтаксис начинается с трёх символов <<<
, после которых должен быть указан произвольный идентификатор (назовём его открывающим). Идентификатор может быть указан как в двойных кавычках, так и без них. Сразу после идентификатора должен следовать перевод на новую строку, никаких других символов кроме перевода на новую строку после идентификатора не должно быть, иначе возникнет ошибка. Далее идёт непосредственно строковое содержимое. После строкового содержимого, на отдельной строке, должен быть указан закрывающий идентификатор (тот же, что и после <<<
). Перед ним и после него не должно быть никаких пробелов или других символов, за исключением точки с запятой. Если это правило нарушено, то считается, что закрывающий идентификатор отсутствует и будет вызвана ошибка:
<<<some_id Hello "World!" some_id; $num = 10; echo <<<"other_id" Число: $num other_id;
Nowdoc-синтаксис
Nowdoc-синтаксис также как и Heredoc является альтернативным способом записи строк.
Строка, определяемая с помощью Nowdoc-синтаксиса, работает также, как и строка, расположенная в одинарных кавычках. Разница между Nowdoc и строкой в одинарных кавычках заключается в том, что используя Nowdoc нет необходимости экранировать одинарные кавычки.
Синтаксис Nowdoc похож на Heredoc с той лишь разницей, что открывающий идентификатор обязательно должен быть заключён в одинарные кавычки:
$num = 10; echo <<<'some_id' Число: $num some_id;
Обработка переменных в строках
Существует два типа синтаксиса обработки переменных в строках: простой и сложный.
Простой синтаксис — это когда имя переменной указывается в строке как есть.
Когда интерпретатор встречает знак доллара, он начинает последовательно проверять являются ли все последующие символы допустимыми символами в имени переменной. Таким образом, чтобы сформировать правильное имя переменной, он захватывает так много символов, на сколько это возможно:
$str = "World!"; echo "Hello $str";
Сложный синтаксис — это когда имя переменной заключается в фигурные скобки.
Так как, для обработки переменной в строке, интерпретатор захватывает так много символов, на сколько это возможно бывают ситуации когда интерпретатор не способен самостоятельно определить, где оканчивается имя переменной:
$sport1 = 'волей'; $sport2 = 'фут'; echo "Мне нравится $sport1бол и $sport2бол";
В данном случае не будет достигнут желаемый результат, поскольку интерпретатор будет считать $sport1
как часть имени переменной $sport1бол
, которой не существует.
Чтобы явно указать интерпретатору, где оканчивается имя переменной требуется заключить имя переменной в фигурные скобки:
$sport1 = 'волей'; $sport2 = 'фут'; echo "Мне нравится {$sport1}бол и {$sport2}бол.";
Знак доллара может быть расположен как перед фигурной скобкой, так и после неё:
$sport1 = 'волей'; $sport2 = 'фут'; echo "Мне нравится ${sport1}бол и {$sport2}бол. ";
Конкатенация
Конкатенация — это объединение двух или более строк в одну большую. Объединение происходит с помощью оператора конкатенации — .
(точка). При конкатенации каждая последующая строка добавляется в конец предыдущей:
<?php echo 'Из двух строк ' . 'делаем одну большую'; ?>
Значение любого типа, которое объединяется со строкой, будет неявно преобразовано в строку и далее будет произведена конкатенация:
<?php $str = "Число: "; $num = 12; echo $str . $num . '<br>'; echo 'Число: ' . 1; ?>
С этой темой смотрят:
PHP — Регулярные выражения — CoderLessons.com
Регулярные выражения — это не что иное, как последовательность или последовательность символов. Они обеспечивают основу для сопоставления с образцом.
Используя регулярное выражение, вы можете искать определенную строку внутри другой строки, вы можете заменить одну строку другой строкой и разбить строку на множество фрагментов.
PHP предлагает функции, специфичные для двух наборов функций регулярного выражения, каждый из которых соответствует определенному типу регулярного выражения. Вы можете использовать любой из них в зависимости от вашего комфорта.
- POSIX регулярные выражения
- Регулярные выражения в стиле PERL
POSIX регулярные выражения
Структура регулярного выражения POSIX не отличается от структуры типичного арифметического выражения: различные элементы (операторы) объединяются для формирования более сложных выражений.
Самое простое регулярное выражение — это выражение, которое соответствует одному символу, например g, внутри строк, таких как g, haggle или bag.
Давайте объясним несколько понятий, используемых в регулярном выражении POSIX. После этого мы познакомим вас с функциями, связанными с регулярными выражениями.
Скобки
Скобки ([]) имеют особое значение при использовании в контексте регулярных выражений. Они используются, чтобы найти диапазон символов.
Sr.No | Выражение и описание |
---|---|
1 | [0-9] Соответствует любой десятичной цифре от 0 до 9. |
2 | [AZ] Соответствует любому символу из строчных букв от a до строчных z. |
3 | [AZ] Соответствует любому символу от прописной буквы A до прописной буквы Z. |
4 | [Az] Соответствует любому символу из строчных букв от A до Z. |
[0-9]
Соответствует любой десятичной цифре от 0 до 9.
[AZ]
Соответствует любому символу из строчных букв от a до строчных z.
[AZ]
Соответствует любому символу от прописной буквы A до прописной буквы Z.
[Az]
Соответствует любому символу из строчных букв от A до Z.
Указанные выше диапазоны являются общими; Вы также можете использовать диапазон [0-3], чтобы соответствовать любой десятичной цифре в диапазоне от 0 до 3, или диапазон [bv], чтобы соответствовать любому символу в нижнем регистре в диапазоне от b до v.
Кванторы
Частота или положение последовательностей символов в скобках и отдельных символов могут быть обозначены специальным символом. Каждый специальный символ имеет определенную коннотацию. +, *,?, {Int. range} и $ flags все следуют за последовательностью символов.
Sr.No | Выражение и описание | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | р + Соответствует любой строке, содержащей хотя бы один p. | ||||||||||||||||||||||||||||||||
2 | п* Это соответствует любой строке, содержащей ноль или более p. | ||||||||||||||||||||||||||||||||
3 | п? Это соответствует любой строке, содержащей ноль или один р. | ||||||||||||||||||||||||||||||||
4 | p { N } Соответствует любой строке, содержащей последовательность из N p | ||||||||||||||||||||||||||||||||
5 | р {2,3} Соответствует любой строке, содержащей последовательность из двух или трех символов p. . {2} $ Соответствует любой строке, содержащей ровно два символа. <б> (. *) </ B> Соответствует любой строке, заключенной в <b> и </ b>. р (л.с.) * Он соответствует любой строке, содержащей ap, за которой следует ноль или более экземпляров последовательности php. Предопределенные диапазоны символовДля вашего удобства программирования доступно несколько предопределенных диапазонов символов, также известных как классы символов. Классы символов задают весь диапазон символов, например, алфавит или набор целых чисел —
[[:альфа:]] Соответствует любой строке, содержащей буквенные символы от aA до zZ. [[: цифры:]] Соответствует любой строке, содержащей числовые цифры от 0 до 9. [[цифра , буква]] Соответствует любой строке, содержащей буквенно-цифровые символы от aA до zZ и от 0 до 9. [[:пространство:]] Соответствует любой строке, содержащей пробел. Функции PHP в регулярных выражениях POSIXВ настоящее время PHP предлагает семь функций для поиска строк с использованием регулярных выражений в стиле POSIX —
Функция ereg () ищет строку, указанную в строке, для строки, заданной шаблоном, возвращает true, если шаблон найден, и false в противном случае. Функция ereg_replace () ищет строку, указанную шаблоном, и заменяет шаблон заменой, если она найдена. Функция eregi () ищет в строке, указанной шаблоном, строку, указанную в строке. Поиск не чувствителен к регистру. Функция eregi_replace () работает точно так же, как ereg_replace (), за исключением того, что поиск шаблона в строке не чувствителен к регистру. Функция split () разделит строку на различные элементы, границы каждого элемента основаны на вхождении шаблона в строку. Функция spliti () работает точно так же, как и ее функция split (), за исключением того, что она не чувствительна к регистру. Функцию sql_regcase () можно рассматривать как служебную функцию, преобразующую каждый символ в строке входного параметра в выражение в квадратных скобках, содержащее два символа. Регулярные выражения в стиле PERLРегулярные выражения в стиле Perl похожи на их аналоги в POSIX. Синтаксис POSIX может использоваться практически взаимозаменяемо с функциями регулярных выражений в стиле Perl. Фактически, вы можете использовать любой из квантификаторов, представленных в предыдущем разделе POSIX. Давайте объясним несколько понятий, используемых в регулярных выражениях PERL. После этого мы познакомим вас с функциями регулярного выражения. МетасимволыМета-символ — это просто алфавитный символ, которому предшествует обратный слеш, который придает комбинации особое значение. Например, вы можете искать большие суммы денег, используя метасимвол ‘\ d’: / ([\ d] +) 000 / , Здесь \ d будет искать любую строку числового символа. Ниже приведен список метасимволов, которые можно использовать в регулярных выражениях стиля PERL. Character Description . a single character \s a whitespace character (space, tab, newline) \S non-whitespace character \d a digit (0-9) \D a non-digit \w a word character (a-z, A-Z, 0-9, _) \W a non-word character [aeiou] matches a single character in the given set [^aeiou] matches a single character outside the given set (foo|bar|baz) matches any of the alternatives specified Модификаторы Доступно несколько модификаторов, которые могут значительно упростить вашу работу с регулярными выражениями, например, чувствительность к регистру, поиск в нескольких строках и т. and $ operators will now PHP-регулярные функции, совместимые с PERLPHP предлагает следующие функции для поиска строк с использованием Perl-совместимых регулярных выражений — Функция preg_match () ищет в строке шаблон, возвращая true, если шаблон существует, и false в противном случае. Функция preg_match_all () сопоставляет все вхождения шаблона в строке. Функция preg_replace () работает так же, как ereg_replace (), за исключением того, что регулярные выражения можно использовать в шаблонах и входных параметрах замены. Функция preg_split () работает точно так же, как split (), за исключением того, что регулярные выражения принимаются в качестве входных параметров для шаблона. Функция preg_grep () ищет все элементы input_array, возвращая все элементы, соответствующие шаблону регулярного выражения. Цитировать символы регулярного выражения Регулярные выражения. Часть 1. Введение. Специальные символы., PHPНаконец-то я добрался до этой статьи, в ней я попытаюсь с нуля рассказать про регулярные выражения в PHP. Для начала — что это такое? Если в двух словах и понятным языком, то регулярные выражения — это метод, основанный на соответствии строки заданному шаблону. Основы основКак я уже сказал, начну с самого нуля. Недаром же я пометил эту статью тегом «Начинающим». А начинается всё со строки в PHP. // создаем строку $stroka = 'abcdefghijklmnopqrstuvwxyz0123456789'; // выводим строку echo $stroka; Если нам сперва нужно определить, находится ли // та же самая строка $stroka = 'abcdefghijklmnopqrstuvwxyz0123456789'; if( preg_match("/abc/", $stroka) ) { // возвратит 1 в случае положительного результата (<code>abc</code> внутри строки) echo $stroka; } Код выше дан исключительно для примера, потому что это не самый оптимальный вариант поиска вхождения в строке, для этого лучше использовать PHP-функции Небольшое отступление про русские буквыХочу обратить ваше внимание, регулярные выражения PHP по умолчанию не поддерживают русские буквы и поэтому далеко не все примеры будут работать корректно, однако это легко исправляется модификатором Подробно в следующем примере. Верхний регистр буквСимволы верхнего и нижнего регистра — не одно и то же. Однако чувствительность к регистру можно отключить при помощи модификатора <?php // строку оставляем пока что ту же $stroka = 'abcdefghijklmnopqrstuvwxyz0123456789'; if( preg_match("/ABC/i", $stroka) ) { // возвратит 1, но если убрать i, то условие уже выполняться не будет echo $stroka; } А теперь то, о чём я упоминал выше — этот же самый пример не будет работать корректно с русскими буквами. абв/u», $stroka) ) { Проще простого, верно ведь? Поиск соответствия концу строки. В чём отличие между \z и $Вот тут уже интереснее. Начну с того, что есть два «конца строки», один — это конец строковой переменной в целом, а другой — конец строки в тексте Так вот, если вам нужны именно последние символы в строковой переменной, всегда используйте // обратите внимание, что после буквы "р" я добавил переход на новую строку $stroka = 'абвгдеёжзиклмнопр\nстуфхцчшщъыьэюя'; if( preg_match("/юя\z/u", $stroka) ) { echo 'Текст оканчивается на "юя"'; } else { echo 'Соответствий не найдено.'; } Очень часто для этих целей используют Вообще мы можем в предыдущем примере заменить Фигурные скобки { }Фигурные скобки позволяют указать, сколько раз должен быть представлен в строке символ (или набор символов), стоящий перед ними. $stroka = 'PHP123'; echo preg_match("/PHP[0-9]{3}/", $stroka); Точка .Точка обозначает любой один символ, кроме переходов на новую строку $stroka = 'этот маг'; // выведет 1, то есть совпадение найдено, но без флага /u работать как надо не будет echo preg_match("/м.г/u", $stroka); Астериск *Звёздочка означает любое количество символа, стоящего перед ней (в том числе 0). Поясню на примере. $stroka = 'php'; // будет выведена 1 как для "php", так для "pp", "phhp", "phhhhhhhp" echo preg_match("/ph*p/", $stroka); Плюс +Плюс практически аналогичен звёздочке за одним единственным исключением — он не учитывает отсутствие символа, то есть, если взять предыдущий пример и строку МишаВпервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология. Если вам нужна помощь с сайтом или разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда будем рады вам помочь! Php проверка строки на символы1-ый способ: поиск строки Проверить наличие текста в абзаце можно через функцию strpos() , которая возвращает позицию указанного текста. Если текст не найден, то функция возвращает -1 . Также можно указать третий параметр, который указывает, откуда начинать искать строку. 2-ой способ: регулярное выражение Проверить наличие текста с помощью регулярных выражений можно через функцию preg_match() . Если надо найти просто текст, как на примере выше, то из-за производительности лучше использовать функцию strpos() . Об этом также написано в официальной документации php.net/manual/ru/function.preg-match.php . Для более сложных поиска текста можно использовать preg_match() . В этой статье рассматриваются различные методы поиска слова, символа или подстроки в тексте. Описываются преимущества и недостатки каждого метода. Использование 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, если подстрока не найдена. Благодаря этому можно проверить, содержит ли строка подстроку. Вот пример: Для регистронезависимого поиска используйте функцию stristr().
Данная публикация представляет собой перевод статьи « Best way to check if a string contains a specific word or substring in PHP » , подготовленной дружной командой проекта Интернет-технологии.ру Как проверить, чтобы строка содержала только цифры, буквы, -, или _ (без пробелов и иных символов? 1 ответ 1Всё ещё ищете ответ? Посмотрите другие вопросы с метками php или задайте свой вопрос.ПохожиеДля подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS. дизайн сайта / логотип © 2019 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4. 0 с указанием ссылки на источник. rev 2019.11.15.35459 PHP string functions — functions-online (русский)Execute and test PHP functions for string manipulation. addslashesВозвращает строку, в которой перед каждым спецсимволом добавлен обратный слэш, например, для последующего использования этой строки в запросе к базе данных и т.п. Экранируются одиночная кавычка (‘), двойная кавычка («), обратный слэш (\) и NUL (байт NULL). bin2hexВозвращает ASCII-строку, содержащую шестнадцатиричное представление аргумента $str. Преобразование производится побайтно, начиная с верхнего полубайта. chrВозвращает строку из одного символа, код которого задан аргументом $ascii. chunk_splitФункция используется для разбиения строки на фрагменты, например, для приведения результата функции base64_encode() в соответствие с требованиями RFC 2045. Она вставляет строку $end после каждых $chunklen символов. count_charsПодсчитывает количество вхождений каждого из символов с ASII-кодами в диапазоне (0. .255) в строке $string и возвращает эту информацию в различных форматах. explodeВозвращает массив строк, полученных разбиением строки $string с использованием $delimiter в качестве разделителя. html_entity_decodehtml_entity_decode() является противоположностью функции htmlentities(). Она преобразует все HTML-сущности в строке $string в соответствующие символы. htmlentitiesЭта функция идентична htmlspecialchars() за исключением того, что htmlentities() преобразует все символы в соответствющие HTML-сущности (для тех символов, для которых HTML сущности существуют). htmlspecialcharsВ HTML некоторые символы имеют специальное значение и для сохранения своего значения должны быть преобразованы в HTML-сущности. Эта функция возвращает строку, над которой проведены эти преобразования. Если вам нужно преобразовать все возможные сущности, используйте htmlentities(). Вызова функции htmlspecialchars() достаточно, если кодировка поддерживает все символы во входной строке (такая как UTF-8, но также ISO-8859-1 при входной только ISO-8859-1). Необходимость в вызове функции htmlentities() появляется только тогда, когда выходная кодировка не поддерживает все символы из входной строки. implodeОбъединяет элементы массива с помощью строки $glue. levenshteinРасстояние Левенштейна — это минимальное количество вставок, замен и удалений символов, необходимое для преобразования $str1 в $str2. Сложность алгоритма равна O(m*n), где n и m — длины строк $str1 и $str2 (неплохо по сравнению с similar_text(), имеющей сложность O(max(n,m)**3), но все же довольно много). В простейшей форме функция принимает в качестве аргументов две строки и возвращает минимальное количество вставок, замен и удалений символов, необходимое для преобразования $str1 в $str2. number_formatФункция принимает один, два или четыре аргумента (не три): Если передан только один аргумент, $number будет отформатирован без дробной части, но с запятой («,») между каждыми тремя цифрами. Если переданы два аргумента, $number будет отформатирован с $decimals знаками после точки («. «) и с запятой («,») между каждыми тремя цифрами. Если переданы все четыре аргумента, $number будет отформатирован с $decimals знаками после точки и с разделителем между между каждыми тремя цифрами, при этом в качестве десятичной точки будет использован $dec_point, а в качестве разделителя групп — $thousands_sep. ordВозвращает ASCII-код первого символа строки $string. Эта функция дополняет функцию chr(). parse_strРазбирает строку $str, которая должна иметь формат строки запроса URL и присваивает значения переменным в текущем контексте. similar_textВычисляет степень похожести двух строк по алгоритму, описанному Oliver [1993]. Эта реализация алгоритма не использует стека, использованного в оригинале, вместо этого применяются рекурсивные вызовы, что в некоторых случаях может ускорить процесс. Сложность алгоритма составляет O(N**3), где N — длина более длинной из двух строк. soundexВозвращает ключ soundex для строки $str. Двум словам, имеющим схожее произношение, соответствует один и тот же ключ soundex. Это свойство может быть использовано, например, при поиске по базе даных, когда известно произношение слова и неизвестно его написание. Данная функция возвращает строку из 4 символов, начинающуюся с буквы. Данная реализация функции soundex описана Дональдом Кнутом (Donald Knuth) в книге «The Art Of Computer Programming, vol. 3: Sorting And Searching», Addison-Wesley (1973), стр. 391-392. str_padЭта функция возвращает строку $input, дополненную слева, справа или с обоих сторон до заданной длины. Если необязательный аргумент $pad_string не передан, то $input будет дополнен пробелами, иначе он будет дополнен символами из $pad_string до нужной длины. str_replaceЭта функция возвращает строку или массив, в котором все вхождения $search в $subject заменены на $replace. Если не нужны сложные правила поиска/замены (например, регулярные выражения), использование этой функции предпочтительнее preg_replace(). str_rot13Выполняет над строкой $str преобразование ROT13 и возвращает полученную строку. Преобразование ROT13 заключается в простом сдвиге каждой латинской буквы на 13 позиций в алфавите, остальные символы не изменяются. Обратное преобразование выполняется той же функцией, так как передача закодированной строки в качестве аргумента вернет ее оригинальную версию. strip_tagsЭта функция пытается возвратить строку $str, из которой удалены все NUL-байты, HTML и PHP теги. Для удаления тегов используется тот же автомат, что и в функции fgetss(). striposИщет позицию первого вхождения подстроки $needle в строку $haystack. stristrВозвращает всю строку $haystack начиная с первого вхождения $needle включительно. strlenВозвращает длину строки $string. strncmpЭта функция подобна strcmp(), за исключением того, что можно указать максимальное количество символов в обоих строках, которые будут участвовать в сравнении. Эта функция учитывает регистр символов. strposИщет позицию первого вхождения подстроки $needle в строку $haystack. strriposИщет позицию последнего вхождения подстроки $needle в строку $haystack. strrposИщет позицию последнего вхождения подстроки $needle в строку $haystack. strstrВозвращает подстроку строки $haystack начиная с первого вхождения $needle (и включая его) и до конца строки $haystack. strtolowerВозвращает строку $string, в которой все буквенные символы переведены в нижний регистр. Принадлежность того или иного символа к буквенным определяется с учетом текущей локали. Это означает, что, например, в используемой по умолчанию локали «C», символ ? не будет преобразован. strtoupperВозвращает строку $string, в которой все буквенные символы переведены в верхний регистр. Принадлежность того или иного символа к буквенным определяется с учетом текущей локали. Это означает, что, например, в используемой по умолчанию локали «C», символ ? не будет преобразован. strtrЕсли указаны три аргумента, эта функция возвращает копию $str, в которой все вхождения каждого символа (однобайтного) из $from были заменены на соответствующий символ в параметре $to, т. е. каждое вхождение из $from[$n] заменяется на $to[$n], где $n это корректное смещение строки в обоих аргументах. Если длины строк $from и $to отличаются, «лишние» символы в более длинной строке не используются. Длина возвращаемого значения будет такой же, как и длина $str. substrВозвращает подстроку строки $string, начинающейся с $start символа по счету и длиной $length символов. substr_countsubstr_count() возвращает число вхождений подстроки $needle в строку $haystack. Заметьте, что параметр $needle чувствителен к регистру. Syllable DivisionThis script, devide string into their syllables. You will recieve an array with all syllables divided. This script is written and tested for german words. The code was started by PHP-Blogger and was modified in details by myself. There are still some bugs. trimЭта функция возвращает строку $str с удаленными из начала и конца строки пробелами. Если второй параметр не передан, trim() удаляет следующие символы:
ucfirstВозвращает строку $str, в которой первый символ переведен в верхний регистр, если этот символ является буквой. Принадлежность того или иного символа к буквенным определяется с учетом текущей локали. Это означает, что, например, в используемой по умолчанию локали «C», символ ä не будет преобразован. ucwordsВозвращает строку $str, в которой первый символ каждого слова переведен в верхний регистр, если этот символ является буквой. Эта функция считает словами последовательности символов, разделенных пробельными символами, которыми являются пробел, разрыв страницы, перевод строки, возврат каретки, горизонтальная и вертикальная табуляция. vsprintfЭта функция подобна sprintf(), но она принимает не переменное число аргументов, а массив. wordwrapПереносит строку по указанному количеству символов. php — Как проверить, содержит ли строка определенное слово? Вы можете использовать регулярные выражения, так как это лучше для сопоставления слов по сравнению с Простое совпадение для Что касается производительности, Редактировать: . Теперь это может быть довольно проблематично в некоторых случаях, так как строка $ search никоим образом не дезинфицируется, я имею в виду, что в некоторых случаях она может не пройти проверку, как если бы Кроме того, вот отличный инструмент для тестирования и просмотра объяснений различных регулярных выражений Regex101 Чтобы объединить оба набора функций в одну универсальную функцию (в том числе с возможностью выбора чувствительности к регистру), вы можете использовать что-то вроде этого: Еще одна вещь, которую следует иметь в виду, это то, что Объяснение этого и решение взято отсюда:
|
Добавить комментарий