Проверьте, встречается ли подстрока в строке в PHP
В этой статье показано, как проверить, встречается ли подстрока в строке в PHP.
1. Использование
strpos() функцияThe strpos() функция возвращает индекс первого вхождения подстроки в строку, а false если подстрока не найдена. Чтобы проверить, найдена ли подстрока в строке или нет, вы можете проверить возвращаемое значение strpos() с использованием !== оператор.
Следующий пример демонстрирует его использование. Обратите внимание на !== оператор. Вы не можете использовать оператор равенства (!=) или оператор отрицания (!) здесь. strpos() функция возвращает 0 если подстрока находится в начале строки, и оба 0 != false а также !0 оценивать false, а также 0 !== false
true.
1 2 3 4 5 6 7 8 | <?php $text = «Some string»; $substr = ‘str’;
if (strpos($text, $substr) !== false) { echo ‘Substring found’; } ?> |
Скачать Выполнить код
Вы можете создать служебную функцию, которая принимает два аргумента: $haystack а также $needle, и возвращается true если $needle является подстрокой ; false в противном случае.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php
function contains($haystack, $needle) { return strpos($haystack, $needle) !== false; }
$text = «Some string»; $substr = ‘str’;
if (contains($text, $substr)) { echo ‘Substring found’; } ?> |
Скачать Выполнить код
Чтобы сделать поиск нечувствительным к регистру, используйте метод.
Это похоже на strpos(), но нечувствителен к регистру.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php
// Возвращает `true`, если `$needle` является подстрокой `$haystack` без учета регистра; // `false` в противном случае function containsCaseIgnored($haystack, $needle) { return stripos($haystack, $needle) !== false; }
$text = «Some string»; $substr = ‘String’;
if (containsCaseIgnored($text, $substr)) { echo ‘Substring found’; } ?> |
Скачать Выполнить код
2. Использование
strstr() функцияДругим вариантом является использование strstr() функция, чтобы определить, встречается ли конкретная подстрока в строке. Он возвращает часть строки, начиная с первого вхождения подстроки до ее конца, или false если подстрока не найдена.
1 2 3 4 5 6 7 8 | <?php $text = «Some string»; $substr = ‘str’;
if (strstr($text, $substr)) { echo ‘Substring found’; } ?> |
Скачать Выполнить код
Обратите внимание, что strpos() работает быстрее и требует меньше памяти, чем strstr() функция. Также обратите внимание, что поиск, выполняемый strstr() функция чувствительна к регистру. Для поиска без учета регистра вы можете использовать stristr() метод.
1 2 4 5 6 7 8 | <?php $text = «Some string»; $substr = ‘String’;
if (stristr($text, $substr)) { echo ‘Substring found’; } ?> |
Скачать Выполнить код
3.
Использование preg_match() функцияНаконец, вы можете использовать preg_match() функция для выполнения сопоставления с регулярным выражением, которое проверяет, встречается ли подстрока в строке. Он возвращается 1 в случае совпадения и 0 в случае не совпадения.
Следующий код демонстрирует его использование. В случае неудачи preg_match() функция может возвращать (или значение, которое оценивается как false). Поэтому всегда следует использовать === оператор для проверки возвращаемого значения этой функции.
1 2 3 4 5 6 7 8 | <?php $text = «Some string»; $substr = ‘str’;
if (preg_match(«/{$substr}/», $text) === 1) { echo ‘Substring found’; } ?> |
Скачать Выполнить код
Обратите внимание, что preg_match() это перебор для такой тривиальной задачи.
strpos() а также strstr() функции. Для поиска без учета регистра вы можете поместить i в конце регулярного выражения.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php
// Возвращает true, если $needle является подстрокой $haystack без учета регистра; // `false` в противном случае function containsCaseIgnored($haystack, $needle) { return preg_match(«/{$needle}/i», $haystack) === 1; }
$text = «Some string»; $substr = ‘String’;
if (containsCaseIgnored($text, $substr)) { echo ‘Substring found’; } ?> |
Скачать Выполнить код
4. Использование
substr_count() функцияВ качестве бонуса вот еще один подход к проверке наличия подстроки в строке.
Он использует substr_count() Функция, которая подсчитывает, сколько раз подстрока встречается в строке. Если это число больше, чем , то мы можем сказать, что подстрока находится внутри строки.
1 2 3 4 5 6 7 8 | <?php $text = «Some string»; $substr = ‘str’;
if (substr_count($text, $substr) > 0) { echo ‘Substring found’; } ?> |
Скачать Выполнить код
Обратите внимание, что поиск чувствителен к регистру. Чтобы сделать поиск нечувствительным к регистру, вы можете преобразовать строку и подстроку в один и тот же регистр (оба в верхнем регистре или оба в нижнем регистре).
1 2 3 4 5 6 7 8 | <?php $text = «Some string»; $substr = ‘String’;
if (substr_count(strtolower($text), strtolower($substr)) > 0) { echo ‘Substring found’; } ?> |
Скачать Выполнить код
Это все, что касается определения того, встречается ли подстрока в строке в PHP.
Оценить этот пост
Средний рейтинг 5/5. Подсчет голосов: 1
Голосов пока нет! Будьте первым, кто оценит этот пост.
Сожалеем, что этот пост не оказался для вас полезным!
Расскажите, как мы можем улучшить этот пост?
Поиск — документация Weblate 4.18
Edit this pageToggle table of contents sidebar
Добавлено в версии 3.9.
Для поиска нужных строк можно использовать расширенные поисковые запросы, включающие в себя логические операции, круглые скобки или поиск по конкретным полям.
Если поле не определено, поиск проводится в исходных, целевых и контекстных строках.
Простой поиск
Любая фраза, введённая в поле поиска, разбивается на слова. При поиске показываются строки, содержащие любое из этих слов. Чтобы найти точную фразу, поместите \»фразу для поиска\» в кавычки (работают как одинарные (\“), так и двойные (\») кавычки): или 'другая закавыченная строка'.
Поля
source:ТЕКСТРегистронезависимый поиск по исходной строке.
target:ТЕКСТРегистронезависимый поиск по целевой строке.
context:ТЕКСТРегистронезависимый поиск по строке контекста.
key:ТЕКСТРегистронезависимый поиск по строке ключа.
note:ТЕКСТРегистронезависимый поиск по описанию исходной строки.
location:ТЕКСТРегистронезависимый поиск по строке местоположения.
priority:ЧИСЛОПриоритет строки.
id:ЧИСЛОУникальный идентификатор строки.
position:ЧИСЛОString position in the translation file.
added:ДАТА_И_ВРЕМЯМетка времени, когда строка была добавлена в Weblate.
state:ТЕКСТSearch for string states (
approved,translated,needs-editing,empty,read-only), supports Операторы поиска по полям.
pending:ЛОГИЧЕСКОЕ_ЗНАЧЕНИЕСтрока, ожидающая сброса в систему контроля версий.
has:ТЕКСТПоиск строк, имеющих атрибуты —
plural,context,suggestion,comment,check,dismissed-check,translation,variant,screenshot,flags,explanation,glossary,note,label.is:ТЕКСТSearch for pending translations (
pending). Can also search for all string states (approved,translated,untranslated,needs-editing,read-only).language:ТЕКСТЦелевой язык строки.
component:ТЕКСТКомпонентный поиск без учёта регистра слов или имён, смотреть раздел Плашка компонента и Название компонента.

project:ТЕКСТПлашка проекта, смотреть раздел URL-плашка.
changed_by:ТЕКСТСтрока была изменена автором с указанным именем пользователя.
changed:ДАТА_И_ВРЕМЯДата изменения содержимого строки, поддерживает операторы поиска по полям.
change_time:ДАТА_И_ВРЕМЯДата изменения строки, поддерживает операторы поиска по полям; в отличии от
changedэто также включает и те события, которые не изменяют само содержимое строки, а также вы можете фильтровать события по конкретным действиям с помощьюchange_action.change_action:ТЕКСТФильтр по действиям, вызвавшим изменения, полезно для использования совместно с
change_time. Принимает название действия на английском или в кавычках и с пробелами или в нижнем регистре и с подчёркиваниями заменёнными на дефисы. Смотрите примеры в разделе «Поиск по изменениям».
check:ТЕКСТString has failing check, see Проверки и исправления for check identifiers.
dismissed_check:ТЕКСТString has dismissed check, see Проверки и исправления for check identifiers.
comment:ТЕКСТПоиск в пользовательских комментариях.
resolved_comment:TEXTПоиск в разрешённых комментариях.
comment_author:ТЕКСТФильтр по авторским комментариям.
suggestion:ТЕКСТПоиск в предложениях.
suggestion_author:ТЕКСТФильтр по автору предложения.
explanation:ТЕКСТПоиск в пояснениях.
label:TEXTПоиск в метках.
screenshot:TEXTПоиск по скриншотам.
Логические операторы
Вы можете комбинировать поисковые запросы, используя для формирования сложных запросов операторы AND, OR и NOT и круглые скобки.
Например: state:translated AND (source:hello OR source:bar)
Операторы поиска по полям
Вы можете указать операторы, диапазоны или частичный поиск по дате или числам:
state:>=translatedСостояние
translatedили лучше (approved).changed:2019Изменено в 2019 году.
changed:[2019-03-01 to 2019-04-01]Изменено между двумя указанными датами.
position:[10 to 100]Strings with position between 10 and 100 (inclusive).
Оператор точного поиска
С помощью оператора = вы можете сделать запрос на точное совпадение различных строковых полей. Например, для нахождения всех исходных строк, точно равных строке hello world, используйте запрос source:="hello world". При поиске односложных выражений кавычки можно опустить. Например, для нахождения всех исходных строк, точно равных строке hello, вы можете использовать запрос source:=hello.
Поиск по изменениям
Добавлено в версии 4.4.
Поиск по истории событий можно сделать с помощью операторов change_action и change_time.
Например, поиск по строкам, отмеченным для правки (marked for edit) в 2018 году, можно сделать с помощью: change_time:2018 AND change_action:marked-for-edit или change_time:2018 AND change_action:"Marked for edit".
Регулярные выражения
Везде, где принимается текст, вы также можете задать и регулярное выражение в виде r"выражение".
Например, для поиска по исходным строкам, содержащим любую цифру от 2 до 5, используйте запрос source:r"[2-5]".
Предопределённые запросы
На странице поиска можно выбрать один из предопределённых запросов, которые позволяют вам быстро получить доступ к наиболее часто встречающимся поисковым запросам:
Упорядочивание результатов
Существует множество вариантов сортировки строк в соответствии с вашими потребностями:
Найти, содержит ли строка другую строку — php
Как узнать, содержит ли строка другую строку в PHP?
Предположим, у нас есть строка, которая хранится в переменной PHP с именем $aString.
И мы хотим узнать, есть ли внутри $aString другая подстрока — скажем для примера, что мы ищем строку «Waldo» внутри большей строки.
Теперь предположим, что имя большей строки ($aString) равно
: «Где Уолдо?». И мы просто хотим узнать, содержит ли $aString «Waldo». PHP предоставляет нам функцию под названием strpos , что позволит нам обнаружить наличие одной строки внутри другой. Вот пример использования функции strpos:
Пример того, как узнать, содержит ли одна строка другую в PHP
if (strpos($aString,'Waldo') !== false) {
echo 'Я нашел Уолдо!';
}
Но есть кое-что, о чем вы должны знать при использовании функции strpos: если вы ищете «Waldo» внутри строки, которая выглядит так: «heyWaldo, вы там?», то функция strpos успешно вернет строку позиция «Вальдо», в основном говоря, что «Вальдо» действительно был найден. Это, конечно, проблема, если вы хотите искать только строку «Waldo» как 9.0016 отдельное слово, а не как часть другого слова.
Strpos никогда не возвращает значение true
Следует помнить, что функция strpos никогда не возвращает логическое значение true. Функция strpos возвращает значение, указывающее позицию первого вхождения искомой подстроки. Если подстрока не найдена, вместо этого возвращается «false» — вот почему в приведенном выше коде мы проверяем наличие false вместо true.
!== против != в PHP
В приведенном выше коде стоит отметить одну вещь: мы использовали оператор !== вместо оператора != (в котором на один «=» меньше). В чем разница между двумя операторами?
Вы можете считать оператор !== более «строгим», чем оператор !=. Это связано с тем, что оператор !== скажет, что два сравниваемых операнда не равны, только если тип двух операндов одинаков, но их значения равны , а не .
Это желательное поведение, поскольку функция strpos может возвращать 0, если искомая строка содержит подстроку в качестве самого первого элемента. 0 будет представлять 0-й индекс большей строки, что означает первую позицию в этой строке.
Таким образом, если $aString — «Waldo is here», а мы ищем «Waldo», то функция strpos вернет 0. Это означает, что выполняемая проверка будет заключаться в том, чтобы увидеть, не равен ли 0 false. Но проблема в том, что 0 также считается целочисленным эквивалентом логического «false» в PHP, что означает, что утверждение «0 != false» будет считаться ложным, потому что 0 равно false в PHP.
Но если вместо этого мы запустим «0 !== false», то это утверждение будет считаться истинным, потому что оно просто добавляет дополнительную проверку, чтобы увидеть, относятся ли 0 и false к одному и тому же типу . Поскольку 0 — целое число, а false — логическое значение, очевидно, что они не равны, поэтому сравнение 0 и false для в равенстве возвращает true, в отличие от проверки «0 != false», которая возвращает false.
Надеюсь, это не было слишком запутанным, и если вам нужна дополнительная информация об этой концепции, вы можете прочитать об этом здесь: Разница между == и === в PHP.
если бы вместо этого у нас был этот код — где мы используем !=, а не !== — тогда это была бы проблема:
Проблемный код для поиска подстроки внутри большей строки
if (strpos($aString,'Waldo') != false) {
echo 'Я нашел Уолдо!';
}
Приведенный выше код может привести к проблемам по причинам, описанным выше. Всегда лучше использовать !== вместо !=.
Строка поиска Mysql содержит апостроф — PHP — Форумы SitePoint
JackAlbright 1
Мне трудно создать запрос, который ищет содержимое базы данных, содержащее одинарные кавычки или символы апострофа.
Я использую mysql_real_escape_string для данных перед помещением их в БД. Затем у меня есть форма поиска, где пользователь может ввести слово или фразу.
Если пользователь ищет «Mayor’s», он не будет найден, потому что в базе данных экранирован апостроф.
(Когда я смотрю непосредственно в базу данных с помощью phpMyAdmin, я вижу, что значение принадлежит мэру)
Итак, вопрос в двух словах: как лучше всего разрешить пользователю искать в базе данных значения, содержащие апостроф, кавычку или любой другой символ, который был бы экранирован с помощью mysql_real_escape_string?
Кстати, строка поиска пользователя также очищается с помощью mysql_real_escape_string, просто чтобы еще больше все усложнить.
Спасибо,
Джек
ДартГвидо 2
Из руководства
Предупреждение
Эта функция устарела, начиная с PHP 5.3.0. Надеяться на эту функцию крайне не рекомендуется.
Предпочтительнее кодировать с выключенными волшебными кавычками и вместо этого при необходимости экранировать данные во время выполнения.




