Как проверить,содержит ли строка конкретное слово

php string substring contains string-matching


Consider:

$a = 'How are you?';

if ($a contains 'are')
    echo 'true';

Предположим, у меня есть код выше, как правильно написать оператор, if ($a contains 'are') ?




Answer 1 codaddict


Вы можете использовать функцию strpos() которая используется для поиска вхождения одной строки в другую:

$a = 'How are you?';

if (strpos($a, 'are') !== false) {
    echo 'true';
}

Обратите внимание, что использование !== false является преднамеренным (ни != false ни === true не вернут желаемый результат); strpos() возвращает либо смещение, с которого начинается строка иглы в строке сена, либо логическое значение false , если игла не найдена. Поскольку 0 является допустимым смещением, а 0 - "ложным", мы не можем использовать более простые конструкции, такие как !strpos($a, 'are') .

Edit:

Теперь с PHP 8 вы можете это сделать:

if (str_contains('How are you', 'are')) { 
    echo 'true';
}

RFC

str_contains




Answer 2 Breezer


Вы можете использовать регулярные выражения, лучше для сопоставления слов по сравнению с strpos , как упоминали другие пользователи, он также будет возвращать true для таких строк, как стоимость, уход, взгляд и т. Д. Этого можно просто избежать в регулярном выражении, используя границы слов.

Простое совпадение может выглядеть вот так:

$a = 'How are you?';

if (preg_match('/\bare\b/', $a)) {
    echo 'true';
}

Что касается производительности, strpos работает примерно в три раза быстрее и имеет в виду, что когда я сделал миллион сравнений одновременно, preg_match потребовалось 1,5 секунды, а для strpos - 0,5 секунды.

Правка:Для поиска по любой части строки,а не только по слову,я бы порекомендовал использовать регулярное выражение вида

$a = 'How are you?';
$search = 'are y';
if(preg_match("/{$search}/i", $a)) {
    echo 'true';
}

Символ i в конце регулярного выражения меняет регулярное выражение на нечувствительное к регистру, если вы этого не хотите, вы можете его пропустить.

Теперь, это может быть довольно проблематично в некоторых случаях, так как строка $ search не очищается каким-либо образом, я имею в виду, что в некоторых случаях она может не пройти проверку, так как если $search является пользовательским вводом, они могут добавить строку, которая может вести себя как какое-то другое регулярное выражение ...

Также, вот отличный инструмент для тестирования и просмотра объяснений различных регулярных выражений Regex101.

Для объединения обоих наборов функций в одну многофункциональную функцию (в том числе с возможностью выбора чувствительности к регистру)можно использовать нечто подобное:

function FindString($needle,$haystack,$i,$word)
{   // $i should be "" or "i" for case insensitive
    if (strtoupper($word)=="W")
    {   // if $word is "W" then word search instead of string in string search.
        if (preg_match("/\b{$needle}\b/{$i}", $haystack)) 
        {
            return true;
        }
    }
    else
    {
        if(preg_match("/{$needle}/{$i}", $haystack)) 
        {
            return true;
        }
    }
    return false;
    // Put quotes around true and false above to return them as strings instead of as bools/ints.
}



Answer 3 ejunker


Вот небольшая полезная функция,которая полезна в таких ситуациях,как эта

// returns true if $needle is a substring of $haystack
function contains($needle, $haystack)
{
    return strpos($haystack, $needle) !== false;
}



Answer 4 FtDRbwLXw6


Хотя большинство из этих ответов скажут вам, появляется ли в вашей строке подстрока, обычно это не то, что вам нужно, если вы ищете определенное слово , а не подстроку .

Какая разница? Подстроки могут появляться внутри других слов:

  • "есть" в начале "области".
  • "есть" в конце "заяц"...
  • В середине "тарифов"...

Одним из способов смягчения этого было бы использование регулярного выражения в сочетании с границами слова ( \b ):

function containsWord($str, $word)
{
    return !!preg_match('#\\b' . preg_quote($word, '#') . '\\b#i', $str);
}

Этот метод не имеет таких же ложных срабатываний, как отмечалось выше, но у него есть некоторые собственные крайние случаи. Границы слов совпадают с несловесными символами ( \W ), которые могут быть чем угодно, кроме a-z , A-Z , 0-9 или _ . Это означает, что цифры и подчеркивания будут учитываться как символы слова, и сценарии, подобные этому, потерпят неудачу:

  • "Есть" в "О чем ты думаешь?"
  • "are" в "lol u dunno wut those are4"?

Если вы хотите что-то более точное,чем это,вам придется начать делать синтаксический разбор английского языка,и это довольно большая банка червей (и предполагает правильное использование синтаксиса,в любом случае,что не всегда является данностью).




Answer 5 Jose Vega


Чтобы определить, содержит ли строка другую строку, вы можете использовать функцию PHP strpos () .

int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

<?php

$haystack = 'how are you';
$needle = 'are';

if (strpos($haystack,$needle) !== false) {
    echo "$haystack contains $needle";
}

?>

CAUTION:

Если искомая игла находится в начале стога сена, она вернет позицию 0, если вы выполните сравнение == , которое не сработает, вам необходимо выполнить ===

Знак == является сравнением и проверяет, имеет ли переменная / выражение / константа слева то же значение, что и переменная / выражение / константа справа.

Знак === - это сравнение, чтобы увидеть, равны ли две переменные / выражения / константы AND имеют ли они один и тот же тип - т.е. оба являются строками или оба являются целыми числами.