Рассматривать:
$a = 'How are you?';
if ($a contains 'are')
echo 'true';
Предположим, у меня есть код выше, как правильно написать заявление if ($a contains 'are')
?
Вы можете использовать strpos()
функцию, которая используется, чтобы найти вхождение одной строки в другую:
$a = 'How are you?';
if (strpos($a, 'are') !== false) {
echo 'true';
}
Обратите внимание, что использование !== false
является преднамеренным (ни != false
не === true
даст желаемого результата); strpos()
возвращает либо смещение, с которого начинается строка иглы в строке сена, либо логическое значение, false
если игла не найдена. Поскольку 0 является допустимым смещением, а 0 - "ложным", мы не можем использовать более простые конструкции, такие как !strpos($a, 'are')
.
strpos($a, 'are') > -1
для проверки на истинность. С точки зрения отладки я обнаружил, что мой мозг тратит меньше тактов, определяя, правильно ли написана строка, когда мне не нужно считать непрерывные знаки равенства.Вы можете использовать регулярные выражения, лучше для сопоставления слов по сравнению с тем,
strpos
что было упомянуто другими пользователями, он также будет возвращать true для таких строк, как стоимость, уход, взгляд и т. Д. Этого можно просто избежать в регулярном выражении, используя границы слов.Простое совпадение для может выглядеть примерно так:
Что
strpos
касается производительности, то это примерно в три раза быстрее, и я имею в виду, что когда я проводил миллион сравнений одновременно,preg_match
для завершения потребовалось 1,5 секунды, а дляstrpos
этого потребовалось 0,5 секунды.Изменить: для поиска любой части строки, а не только слово за словом, я бы рекомендовал использовать регулярное выражение, как
В
i
конце регулярного выражения регулярное выражение изменяется без учета регистра, если вы этого не хотите, вы можете его оставить.Теперь, это может быть довольно проблематично в некоторых случаях, так как строка поиска $ не очищается каким-либо образом, я имею в виду, что она может не пройти проверку в некоторых случаях, как если
$search
бы пользовательский ввод мог добавить некоторую строку, которая могла бы вести себя как какое-то другое регулярное выражение ...Также, вот отличный инструмент для тестирования и просмотра объяснений различных регулярных выражений Regex101.
Чтобы объединить оба набора функций в одну многоцелевую функцию (в том числе с возможностью выбора чувствительности к регистру), вы можете использовать что-то вроде этого:
источник
Вот небольшая полезная функция, которая полезна в подобных ситуациях
источник
if ($email->contains("@") && $email->endsWith(".com)) { ...
илиif (strpos($email, "@") !== false && substr($email, -strlen(".com")) == ".com") { ...
Хотя большинство из этих ответов скажут вам, появляется ли в вашей строке подстрока, обычно это не то, что вам нужно, если вы ищете определенное слово , а не подстроку .
Какая разница? Подстроки могут появляться в других словах:
Одним из способов смягчения этого было бы использование регулярного выражения в сочетании с границами слов (
\b
):Этот метод не имеет таких же ложных срабатываний, как указано выше, но у него есть некоторые собственные крайние случаи. Границы слова совпадают с символами без слов (
\W
), которые собираются быть ничего , что неa-z
,A-Z
,0-9
или_
. Это означает, что цифры и подчеркивания будут учитываться как символы слова, и сценарии, подобные этому, потерпят неудачу:Если вы хотите что-то более точное, чем это, вам придется начать синтаксический анализ английского языка, и это довольно большая червь (и, во всяком случае, предполагает правильное использование синтаксиса, что не всегда дано).
источник
\b
соответствует двум вещам, которые\W
не соответствуют, что делает его отличным для поиска слов в строке: Это соответствует началу string (^
) и концу string ($
)Чтобы определить, содержит ли строка другую строку, вы можете использовать функцию PHP strpos () .
int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
ВНИМАНИЕ:
Если искомая игла находится в начале стога сена, она вернет позицию 0, если вы сделаете
==
сравнение, которое не будет работать, вам нужно будет выполнить===
==
Знак сравнение и тесты , имеет ли переменные / выражение / постоянные влево такое же значение , как переменные / выражение / константу справа.===
Знак сравнения , чтобы увидеть ли две переменные / постоянные / как выражения равныAND
имеют одинаковый тип - то есть оба строки или оба являются целыми числами.источник
Посмотрите на
strpos()
:источник
Использование
strstr()
или,stristr()
если ваш поиск должен быть без учета регистра, было бы другим вариантом.источник
strstr($a, 'are')
гораздо элегантнее, чем уродливыйstrpos($a, 'are') !== false
. PHP действительно нуждается вstr_contains()
функции.Используйте сопоставление без учета регистра, используя
stripos()
:источник
Посмотрите на комментарии SamGoody и Lego Stormtroopr.
Если вы ищете алгоритм PHP для ранжирования результатов поиска на основе близости / релевантности нескольких слов, здесь вы найдете быстрый и простой способ получения результатов поиска только с помощью PHP:
Проблемы , связанные с другими методами булева поиска , такие как
strpos()
,preg_match()
,strstr()
илиstristr()
Метод PHP, основанный на модели векторного пространства и tf-idf (термин «частота - обратная частота документа»):
Звучит сложно, но на удивление легко.
Если мы хотим найти несколько слов в строке, основная проблема заключается в том, как мы назначаем вес каждому из них?
Если бы мы могли взвешивать термины в строке на основе того, насколько они представительны для строки в целом, мы могли бы упорядочить наши результаты по тем, которые лучше всего соответствуют запросу.
Это идея модели векторного пространства, не очень похожая на то, как работает полнотекстовый поиск SQL:
ДЕЛО 1
РЕЗУЛЬТАТ
ДЕЛО 2
РЕЗУЛЬТАТЫ
ДЕЛО 3
РЕЗУЛЬТАТЫ
Есть много улучшений , которые будут сделаны , но модель обеспечивает способ получения результатов хороших из естественных запросов, которые не имеют логических операторов , таких как
strpos()
,preg_match()
,strstr()
илиstristr()
.НОТА БЕНЕ
Опционально устранение избыточности перед поиском по словам
тем самым уменьшая размер индекса и приводя к меньшему требованию к памяти
меньше дискового ввода / вывода
более быстрая индексация и, следовательно, более быстрый поиск.
1. Нормализация
2. Устранение стоп-слов
3. Подстановка словаря
Замените слова другими словами, которые имеют одинаковое или похожее значение. (например: заменить «голодный» и «голодный» на «голодный»)
Дальнейшие алгоритмические меры (снежный ком) могут быть выполнены для дальнейшего приведения слов к их существенному значению.
Замена имен цветов их шестнадцатеричными эквивалентами
Сокращение числовых значений за счет снижения точности являются другими способами нормализации текста.
РЕСУРСЫ
источник
Если вы хотите избежать проблем "falsey" и "truey", вы можете использовать substr_count:
Это немного медленнее, чем strpos, но позволяет избежать проблем сравнения.
источник
false
для "ты уверен?" так как положение наstrpos
это0
Другой вариант - использовать функцию strstr () . Что-то вроде:
Обратите внимание: функция strstr () чувствительна к регистру. Для поиска без учета регистра используйте функцию stristr () .
источник
источник
WARNING preg_match(): Delimiter must not be alphanumeric or backslash
Я немного впечатлен тем, что ни один из ответов, которые здесь использовались
strpos
,strstr
и подобные функции еще не упоминали многобайтовые строковые функции (2015-05-08).В основном, если у вас возникают проблемы с поиском слов с символами, характерными для некоторых языков , например, немецкого, французского, португальского, испанского и т. Д. (Например, ä , é , ô , ç , º , ñ ), вам может потребоваться предшествовать функции с
mb_
. Следовательно, принятый ответ будет использоватьmb_strpos
илиmb_stripos
(для сопоставления без учета регистра) вместо:Если вы не можете гарантировать, что все ваши данные на 100% в UTF-8 , вы можете использовать эти
mb_
функции.Хорошая статья , чтобы понять , почему это абсолютный минимум каждый разработчик программного обеспечения Абсолютно положительно должны знать о Unicode и наборов символов , (не отговорки!) По Джоэл Спольски .
источник
В PHP лучший способ проверить, содержит ли строка определенную подстроку, - использовать простую вспомогательную функцию, подобную этой:
Объяснение:
strpos
находит позицию первого вхождения чувствительной к регистру подстроки в строке.stripos
находит позицию первого вхождения нечувствительной к регистру подстроки в строке.myFunction($haystack, $needle) === FALSE ? FALSE : TRUE
гарантирует, чтоmyFunction
всегда возвращает логическое значение и исправляет непредвиденное поведение, когда индекс подстроки равен 0.$caseSensitive ? A : B
выбирает либо,strpos
либоstripos
сделать работу, в зависимости от значения$caseSensitive
.Вывод:
источник
Функция ниже также работает и не зависит от какой-либо другой функции; он использует только нативную обработку строк PHP. Лично я не рекомендую это, но вы можете увидеть, как это работает:
Тестовое задание:
источник
Вы можете использовать
strstr
функцию:Без использования встроенной функции:
источник
У меня были некоторые проблемы с этим, и, наконец, я решил создать свое собственное решение. Без использования механизма регулярных выражений :
Вы можете заметить, что предыдущие решения не являются ответом на слово, используемое в качестве префикса для другого. Чтобы использовать ваш пример:
С примерами выше, оба
$a
и$b
содержит$c
, но вы можете захотеть, чтобы ваша функция сообщала вам, что только$a
содержит$c
.источник
$found = false
в началеДругой вариант поиска вхождения слова из строки с помощью strstr () и stristr () выглядит следующим образом:
источник
i
Вstristr
означает нечувствительны.Много ответов, которые используют,
substr_count
проверяет, если результат>0
. Но посколькуif
оператор считает ноль таким же, как и ложь , вы можете избежать этой проверки и написать напрямую:Чтобы проверить, если нет , добавьте
!
оператор:источник
Это можно сделать тремя разными способами:
1-стристр ()
2- strpos ()
3- preg_match ()
источник
Сокращенная версия
источник
Чтобы найти «слово», а не набор букв, которые на самом деле могут быть частью другого слова, хорошим решением будет следующее.
источник
$string
этоAre are, are?
Вы должны использовать регистр без учета регистра, поэтому, если введенное значение соответствует
small
илиcaps
не имеет значения.Здесь стрипос находит иголку в стоге сена без учета случая (маленький / колпачки).
Пример PHPCode с выводом
источник
Может быть, вы могли бы использовать что-то вроде этого:
источник
Не используйте,
preg_match()
если вы хотите только проверить, содержится ли одна строка в другой строке. Используйтеstrpos()
илиstrstr()
вместо этого, поскольку они будут быстрее. ( http://in2.php.net/preg_match )источник
Если вы хотите проверить, содержит ли строка несколько специфических слов, вы можете сделать:
Это полезно, чтобы избежать спама при отправке электронных писем, например.
источник
Функция strpos работает нормально, но если вы хотите выполнить
case-insensitive
проверку слова в абзаце, вы можете использоватьstripos
функциюPHP
.Например,
Найти позицию первого вхождения нечувствительной к регистру подстроки в строке.
Если слово не существует в строке, оно вернет false, иначе вернет позицию слова.
источник
Вам нужно использовать идентичные / не идентичные операторы, потому что strpos может вернуть 0 в качестве значения индекса. Если вам нравятся троичные операторы, подумайте над тем, чтобы использовать следующее (я думаю, что это немного задом наперед):
источник
Это означает, что строка должна быть преобразована в слова (см. Примечание ниже).
Один из способов сделать это и указать разделители - использовать
preg_split
( doc ):Бег дает
Примечание: здесь мы не подразумеваем слово для каждой последовательности символов.
Практическим определением слова является в этом смысле механизм регулярных выражений PCRE, где слова - это подстроки, состоящие только из символов слова, разделенные несловесными символами.
источник
Другое решение для конкретной строки:
Вы также можете использовать
strpos()
функцию.источник