Проверьте, встречается ли подстрока в строке в 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. Надеяться на эту функцию крайне не рекомендуется.
Предпочтительнее кодировать с выключенными волшебными кавычками и вместо этого при необходимости экранировать данные во время выполнения.