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

2661

Рассматривать:

$a = 'How are you?';

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

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

Чарльз Юнг
источник

Ответы:

6895

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

$a = 'How are you?';

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

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

codaddict
источник
261
Очень поздно на вечеринку, но будьте осторожны с этим. Это также вернет true для строки «Вам не все равно?»
DTest
167
@DTest - ну да, конечно, он вернет true, потому что строка содержит 'are'. Если вы ищете именно слово ARE, вам нужно будет сделать больше проверок, например, проверить, есть ли символ или пробел перед
буквой
40
Очень хорошие комментарии выше! Я никогда не использую! = Или ==, в конце концов! == и === - лучший вариант (на мой взгляд) из всех рассмотренных аспектов (скорость, точность и т. Д.).
Мелси
10
@jsherk Почему бы не регулярные выражения, тогда? Что-то вроде "есть".
Джулио Мускарелло
22
Я стараюсь избегать этой проблемы, всегда используя strpos($a, 'are') > -1для проверки на истинность. С точки зрения отладки я обнаружил, что мой мозг тратит меньше тактов, определяя, правильно ли написана строка, когда мне не нужно считать непрерывные знаки равенства.
Уравнение
608

Вы можете использовать регулярные выражения, лучше для сопоставления слов по сравнению с тем, 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бы пользовательский ввод мог добавить некоторую строку, которая могла бы вести себя как какое-то другое регулярное выражение ...

Также, вот отличный инструмент для тестирования и просмотра объяснений различных регулярных выражений 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.
}
Breezer
источник
9
@ Александр.Плутов во-вторых ты мне даешь -1 а не вопрос? Cmon это займет 2 секунды, чтобы
найти
64
+1 Это ужасный способ поиска простой строки, но многие посетители SO ищут какой-либо способ поиска любой из своих собственных подстрок, и полезно, чтобы предложение было выдвинуто. Даже ОП мог бы упростить - дайте ему знать о своих альтернативах.
SamGoody
72
Технически вопрос состоит в том, как найти слова, а не подстроку. Это действительно помогло мне, так как я могу использовать это с границами регулярных выражений. Альтернативы всегда полезны.
15
+1 за ответ и -1 за комментарий @ plutov.by, потому что strpos - это всего лишь одна проверка, в то время как regexp позволяет проверять много слов одновременно, например: preg_match (/ are | you | not /)
albanx
4
Регулярные выражения должны быть последним средством. Их использование в тривиальных задачах не рекомендуется. Я настаиваю на этом с высоты многих лет копания плохого кода.
Йенцунь
257

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

// returns true if $needle is a substring of $haystack
function contains($needle, $haystack)
{
    return strpos($haystack, $needle) !== false;
}
ejunker
источник
74
@RobinvanBaalen На самом деле, это может улучшить читаемость кода. Кроме того, отрицательные голоса должны быть за (очень) плохие ответы, а не за "нейтральные".
Xaqq
37
Функции @RobinvanBaalen почти по определению удобочитаемы (чтобы передать идею того, что вы делаете). Сравните, что более читабельно: if ($email->contains("@") && $email->endsWith(".com)) { ...илиif (strpos($email, "@") !== false && substr($email, -strlen(".com")) == ".com") { ...
Брандин
3
@RobinvanBaalen в конце концов, правила должны быть нарушены. В противном случае люди не придумали бы новые изобретательные способы ведения дел :). Кроме того, я должен признать, что у меня есть проблемы с тем, чтобы сосредоточиться на таких вещах, как на martinfowler.com. Угадайте, что нужно сделать, это попробовать самим и выяснить, какие подходы наиболее удобны.
Джеймс П.
5
Другое мнение: наличие вспомогательной функции, которую вы можете легко обернуть, может помочь при отладке. Кроме того, это вызывает призыв к хорошим оптимизаторам, которые устраняют такие издержки в производственных сервисах. Таким образом, все мнения имеют действительные пункты. ;)
Тино
18
Конечно, это полезно. Вы должны поощрять это. Что произойдет, если в PHP 100 появился новый и более быстрый способ поиска местоположений строк? Вы хотите изменить все свои места, где вы звоните strpos? Или вы хотите изменить только содержимое внутри функции?
Космин
143

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

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

  • «Есть» в начале «области»
  • «Есть» в конце «заяц»
  • «Есть» в середине «тарифы»

Одним из способов смягчения этого было бы использование регулярного выражения в сочетании с границами слов ( \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 те are4?"

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

FtDRbwLXw6
источник
24
это должен быть канонический ответ. Поскольку мы ищем слова, а не подстроки , регулярное выражение подходит. Я также добавлю, что \bсоответствует двум вещам, которые \Wне соответствуют, что делает его отличным для поиска слов в строке: Это соответствует началу string ( ^) и концу string ( $)
code_monk
это должен быть правильный ответ. Остальные ответы найдут «есть» в строке типа «тебе не все равно» .. Как уже упоминалось @Dtest
Роберт Синклер
@RobertSinclair Это так плохо? Если бы вы спросили меня, содержит ли строка «вас волнует» слово «есть», я бы сказал «да». Слово «являются» явно является подстрокой этой строки. Это отдельный вопрос от "" "Есть" это "одно из слов в строке" вам не все равно "" "".
Пол
@Paulpro Eventhough OP не указал, что $ a - это фраза, я уверен, что она подразумевалась. Поэтому его вопрос заключался в том, как обнаружить Слово внутри фразы. Нет, если Слово содержит в себе Слово, которое, как я полагаю, чаще всего не имеет значения.
Роберт Синклер
@ Джимбо, это действительно работает, вы просто пропускаете `\` 3v4l.org/ZRpYi
MetalWeirdo
125

Чтобы определить, содержит ли строка другую строку, вы можете использовать функцию 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";
}

?>

ВНИМАНИЕ:

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

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

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

Jose Vega
источник
67

Посмотрите наstrpos() :

<?php
    $mystring = 'abc';
    $findme   = 'a';
    $pos = strpos($mystring, $findme);

    // Note our use of ===. Simply, == would not work as expected
    // because the position of 'a' was the 0th (first) character.
    if ($pos === false) {
        echo "The string '$findme' was not found in the string '$mystring'.";
    }
    else {
        echo "The string '$findme' was found in the string '$mystring',";
        echo " and exists at position $pos.";
    }
?>
Хаим Евги
источник
62

Использование strstr()или, stristr()если ваш поиск должен быть без учета регистра, было бы другим вариантом.

glutorange
источник
9
Примечание на странице php.net/manual/en/function.strstr.php : Примечание. Если вы хотите только определить, находится ли конкретная игла в стоге сена, используйте вместо этого более быструю и менее интенсивную функцию памяти strpos ().
Джо Смо
@tastro Есть ли авторитетные тесты по этому вопросу?
Уэйн Уитти
Это может быть медленнее, но ИМХО strstr($a, 'are')гораздо элегантнее, чем уродливый strpos($a, 'are') !== false. PHP действительно нуждается в str_contains()функции.
Пол Шпигель
Меня
поражает,
45

Используйте сопоставление без учета регистра, используя stripos():

if (stripos($string,$stringToSearch) !== false) {
    echo 'true';
}
Шанкар Дамодаран
источник
45

Посмотрите на комментарии SamGoody и Lego Stormtroopr.

Если вы ищете алгоритм PHP для ранжирования результатов поиска на основе близости / релевантности нескольких слов, здесь вы найдете быстрый и простой способ получения результатов поиска только с помощью PHP:

Проблемы , связанные с другими методами булева поиска , такие как strpos(), preg_match(), strstr()илиstristr()

  1. не могу найти несколько слов
  2. результаты не оценены

Метод PHP, основанный на модели векторного пространства и tf-idf (термин «частота - обратная частота документа»):

Звучит сложно, но на удивление легко.

Если мы хотим найти несколько слов в строке, основная проблема заключается в том, как мы назначаем вес каждому из них?

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

Это идея модели векторного пространства, не очень похожая на то, как работает полнотекстовый поиск SQL:

function get_corpus_index($corpus = array(), $separator=' ') {

    $dictionary = array();

    $doc_count = array();

    foreach($corpus as $doc_id => $doc) {

        $terms = explode($separator, $doc);

        $doc_count[$doc_id] = count($terms);

        // tf–idf, short for term frequency–inverse document frequency, 
        // according to wikipedia is a numerical statistic that is intended to reflect 
        // how important a word is to a document in a corpus

        foreach($terms as $term) {

            if(!isset($dictionary[$term])) {

                $dictionary[$term] = array('document_frequency' => 0, 'postings' => array());
            }
            if(!isset($dictionary[$term]['postings'][$doc_id])) {

                $dictionary[$term]['document_frequency']++;

                $dictionary[$term]['postings'][$doc_id] = array('term_frequency' => 0);
            }

            $dictionary[$term]['postings'][$doc_id]['term_frequency']++;
        }

        //from http://phpir.com/simple-search-the-vector-space-model/

    }

    return array('doc_count' => $doc_count, 'dictionary' => $dictionary);
}

function get_similar_documents($query='', $corpus=array(), $separator=' '){

    $similar_documents=array();

    if($query!=''&&!empty($corpus)){

        $words=explode($separator,$query);

        $corpus=get_corpus_index($corpus, $separator);

        $doc_count=count($corpus['doc_count']);

        foreach($words as $word) {

            if(isset($corpus['dictionary'][$word])){

                $entry = $corpus['dictionary'][$word];


                foreach($entry['postings'] as $doc_id => $posting) {

                    //get term frequency–inverse document frequency
                    $score=$posting['term_frequency'] * log($doc_count + 1 / $entry['document_frequency'] + 1, 2);

                    if(isset($similar_documents[$doc_id])){

                        $similar_documents[$doc_id]+=$score;

                    }
                    else{

                        $similar_documents[$doc_id]=$score;

                    }
                }
            }
        }

        // length normalise
        foreach($similar_documents as $doc_id => $score) {

            $similar_documents[$doc_id] = $score/$corpus['doc_count'][$doc_id];

        }

        // sort from  high to low

        arsort($similar_documents);

    }   

    return $similar_documents;
}

ДЕЛО 1

$query = 'are';

$corpus = array(
    1 => 'How are you?',
);

$match_results=get_similar_documents($query,$corpus);
echo '<pre>';
    print_r($match_results);
echo '</pre>';

РЕЗУЛЬТАТ

Array
(
    [1] => 0.52832083357372
)

ДЕЛО 2

$query = 'are';

$corpus = array(
    1 => 'how are you today?',
    2 => 'how do you do',
    3 => 'here you are! how are you? Are we done yet?'
);

$match_results=get_similar_documents($query,$corpus);
echo '<pre>';
    print_r($match_results);
echo '</pre>';

РЕЗУЛЬТАТЫ

Array
(
    [1] => 0.54248125036058
    [3] => 0.21699250014423
)

ДЕЛО 3

$query = 'we are done';

$corpus = array(
    1 => 'how are you today?',
    2 => 'how do you do',
    3 => 'here you are! how are you? Are we done yet?'
);

$match_results=get_similar_documents($query,$corpus);
echo '<pre>';
    print_r($match_results);
echo '</pre>';

РЕЗУЛЬТАТЫ

Array
(
    [3] => 0.6813781191217
    [1] => 0.54248125036058
)

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

НОТА БЕНЕ

Опционально устранение избыточности перед поиском по словам

  • тем самым уменьшая размер индекса и приводя к меньшему требованию к памяти

  • меньше дискового ввода / вывода

  • более быстрая индексация и, следовательно, более быстрый поиск.

1. Нормализация

  • Преобразовать весь текст в нижний регистр

2. Устранение стоп-слов

  • Исключите из текста слова, которые не имеют реального значения (например, «и», «или», «the», «for» и т. Д.)

3. Подстановка словаря

  • Замените слова другими словами, которые имеют одинаковое или похожее значение. (например: заменить «голодный» и «голодный» на «голодный»)

  • Дальнейшие алгоритмические меры (снежный ком) могут быть выполнены для дальнейшего приведения слов к их существенному значению.

  • Замена имен цветов их шестнадцатеричными эквивалентами

  • Сокращение числовых значений за счет снижения точности являются другими способами нормализации текста.

РЕСУРСЫ

RafaSashi
источник
40

Если вы хотите избежать проблем "falsey" и "truey", вы можете использовать substr_count:

if (substr_count($a, 'are') > 0) {
    echo "at least one 'are' is present!";
}

Это немного медленнее, чем strpos, но позволяет избежать проблем сравнения.

Алан Пиралла
источник
Он возвращается falseдля "ты уверен?" так как положение на strposэто0
Hafenkranich
30

Другой вариант - использовать функцию strstr () . Что-то вроде:

if (strlen(strstr($haystack,$needle))>0) {
// Needle Found
}

Обратите внимание: функция strstr () чувствительна к регистру. Для поиска без учета регистра используйте функцию stristr () .

YashG99
источник
1
strstr () возвращает FALSE, если игла не найдена. Так что в strlen нет необходимости.
Айеш К
29
if (preg_match('/(are)/', $a)) {
   echo 'true';
}
joan16v
источник
3
Я получаю следующее предупреждение:WARNING preg_match(): Delimiter must not be alphanumeric or backslash
Патрос
27

Я немного впечатлен тем, что ни один из ответов, которые здесь использовались strpos, strstrи подобные функции еще не упоминали многобайтовые строковые функции (2015-05-08).

В основном, если у вас возникают проблемы с поиском слов с символами, характерными для некоторых языков , например, немецкого, французского, португальского, испанского и т. Д. (Например, ä , é , ô , ç , º , ñ ), вам может потребоваться предшествовать функции с mb_. Следовательно, принятый ответ будет использовать mb_strposили mb_stripos(для сопоставления без учета регистра) вместо:

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

Если вы не можете гарантировать, что все ваши данные на 100% в UTF-8 , вы можете использовать эти mb_функции.

Хорошая статья , чтобы понять , почему это абсолютный минимум каждый разработчик программного обеспечения Абсолютно положительно должны знать о Unicode и наборов символов , (не отговорки!) По Джоэл Спольски .

Armfoot
источник
25

В PHP лучший способ проверить, содержит ли строка определенную подстроку, - использовать простую вспомогательную функцию, подобную этой:

function contains($haystack, $needle, $caseSensitive = false) {
    return $caseSensitive ?
            (strpos($haystack, $needle) === FALSE ? FALSE : TRUE):
            (stripos($haystack, $needle) === FALSE ? FALSE : TRUE);
}

Объяснение:

  • strpos находит позицию первого вхождения чувствительной к регистру подстроки в строке.
  • stripos находит позицию первого вхождения нечувствительной к регистру подстроки в строке.
  • myFunction($haystack, $needle) === FALSE ? FALSE : TRUEгарантирует, что myFunctionвсегда возвращает логическое значение и исправляет непредвиденное поведение, когда индекс подстроки равен 0.
  • $caseSensitive ? A : Bвыбирает либо, strposлибо striposсделать работу, в зависимости от значения $caseSensitive.

Вывод:

var_dump(contains('bare','are'));            // Outputs: bool(true)
var_dump(contains('stare', 'are'));          // Outputs: bool(true)
var_dump(contains('stare', 'Are'));          // Outputs: bool(true)
var_dump(contains('stare', 'Are', true));    // Outputs: bool(false)
var_dump(contains('hair', 'are'));           // Outputs: bool(false)
var_dump(contains('aren\'t', 'are'));        // Outputs: bool(true)
var_dump(contains('Aren\'t', 'are'));        // Outputs: bool(true)
var_dump(contains('Aren\'t', 'are', true));  // Outputs: bool(false)
var_dump(contains('aren\'t', 'Are'));        // Outputs: bool(true)
var_dump(contains('aren\'t', 'Are', true));  // Outputs: bool(false)
var_dump(contains('broad', 'are'));          // Outputs: bool(false)
var_dump(contains('border', 'are'));         // Outputs: bool(false)
Джон Слегерс
источник
22

Функция ниже также работает и не зависит от какой-либо другой функции; он использует только нативную обработку строк PHP. Лично я не рекомендую это, но вы можете увидеть, как это работает:

<?php

if (!function_exists('is_str_contain')) {
  function is_str_contain($string, $keyword)
  {
    if (empty($string) || empty($keyword)) return false;
    $keyword_first_char = $keyword[0];
    $keyword_length = strlen($keyword);
    $string_length = strlen($string);

    // case 1
    if ($string_length < $keyword_length) return false;

    // case 2
    if ($string_length == $keyword_length) {
      if ($string == $keyword) return true;
      else return false;
    }

    // case 3
    if ($keyword_length == 1) {
      for ($i = 0; $i < $string_length; $i++) {

        // Check if keyword's first char == string's first char
        if ($keyword_first_char == $string[$i]) {
          return true;
        }
      }
    }

    // case 4
    if ($keyword_length > 1) {
      for ($i = 0; $i < $string_length; $i++) {
        /*
        the remaining part of the string is equal or greater than the keyword
        */
        if (($string_length + 1 - $i) >= $keyword_length) {

          // Check if keyword's first char == string's first char
          if ($keyword_first_char == $string[$i]) {
            $match = 1;
            for ($j = 1; $j < $keyword_length; $j++) {
              if (($i + $j < $string_length) && $keyword[$j] == $string[$i + $j]) {
                $match++;
              }
              else {
                return false;
              }
            }

            if ($match == $keyword_length) {
              return true;
            }

            // end if first match found
          }

          // end if remaining part
        }
        else {
          return false;
        }

        // end for loop
      }

      // end case4
    }

    return false;
  }
}

Тестовое задание:

var_dump(is_str_contain("test", "t")); //true
var_dump(is_str_contain("test", "")); //false
var_dump(is_str_contain("test", "test")); //true
var_dump(is_str_contain("test", "testa")); //flase
var_dump(is_str_contain("a----z", "a")); //true
var_dump(is_str_contain("a----z", "z")); //true 
var_dump(is_str_contain("mystringss", "strings")); //true 
Джейсон ООО
источник
13
Не могли бы вы сказать мне, почему в мире вы бы использовали такую ​​функцию, когда strpos - это вполне жизнеспособное решение? ...
sg3s
3
@ sg3s: вы абсолютно правы, однако, strpos также основан на чем-то подобном, также я не выложил это для представителя только для того, чтобы поделиться кое-какими знаниями
Jason OOO
последнее var_dump ложно
Солнечный
1
@Sunny: это была опечатка: var_dump (is_str_contain ("mystringss", "strings")); // true
Джейсон ООО
22

Вы можете использовать strstrфункцию:

$haystack = "I know programming";
$needle   = "know";
$flag = strstr($haystack, $needle);

if ($flag){

    echo "true";
}

Без использования встроенной функции:

$haystack  = "hello world";
$needle = "llo";

$i = $j = 0;

while (isset($needle[$i])) {
    while (isset($haystack[$j]) && ($needle[$i] != $haystack[$j])) {
        $j++;
        $i = 0;
    }
    if (!isset($haystack[$j])) {
        break;
    }
    $i++;
    $j++;

}
if (!isset($needle[$i])) {
    echo "YES";
}
else{
    echo "NO ";
}
Аршид К.В.
источник
2
Сбой при поиске по первому слову.
T30
20

У меня были некоторые проблемы с этим, и, наконец, я решил создать свое собственное решение. Без использования механизма регулярных выражений :

function contains($text, $word)
{
    $found = false;
    $spaceArray = explode(' ', $text);

    $nonBreakingSpaceArray = explode(chr(160), $text);

    if (in_array($word, $spaceArray) ||
        in_array($word, $nonBreakingSpaceArray)
       ) {

        $found = true;
    }
    return $found;
 }

Вы можете заметить, что предыдущие решения не являются ответом на слово, используемое в качестве префикса для другого. Чтобы использовать ваш пример:

$a = 'How are you?';
$b = "a skirt that flares from the waist";
$c = "are";

С примерами выше, оба $aи $bсодержит $c, но вы можете захотеть, чтобы ваша функция сообщала вам, что только $aсодержит $c.

Decebal
источник
1
Вы, вероятно, имели в виду: $found = falseв начале
замедление
1
Ваша функция может не работать, если слово связано с запятой, вопросительным знаком или точкой. например, «что ты видишь, то и получаешь». и вы хотите определить, есть ли «get» в предложении. Обратите внимание на точку остановки рядом с «получить». В этом случае ваша функция возвращает false. Рекомендуется использовать регулярное выражение или substr (я думаю, что оно использует регулярное выражение в любом случае) для поиска / замены строк.
светоносец
@ lightbringer вы не могли бы быть более неправильно с вашей рекомендацией, что это значит для вас "это рекомендуется"? нет верховного человека, который рекомендует или одобряет. Речь идет об использовании механизма регулярных выражений в php, который является черной дырой в самом языке, вы можете попробовать поместить в регулярное выражение совпадения и сравнить результаты.
декабрь
Этот ответ плохо продемонстрирован и терпит неудачу во многих расширенных сценариях. Я не вижу никакой пользы в развлечении этой техникой. Вот улучшенная пользовательская функция и повторный вызов: 3v4l.org/E9dfD Меня не интересует редактирование этой вики, потому что я считаю, что она тратит время исследователей.
mickmackusa
18

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

<?php
    $a = 'How are you?';
    if (strstr($a,'are'))  // Case sensitive
        echo 'true';
    if (stristr($a,'are'))  // Case insensitive
        echo 'true';
?>
Sadikhasan
источник
Это задом наперед. iВ stristrозначает нечувствительны.
Адам Меррифилд
18

Много ответов, которые используют, substr_countпроверяет, если результат >0. Но поскольку ifоператор считает ноль таким же, как и ложь , вы можете избежать этой проверки и написать напрямую:

if (substr_count($a, 'are')) {

Чтобы проверить, если нет , добавьте !оператор:

if (!substr_count($a, 'are')) {
T30
источник
Ну ... частично верно, в php 0 == false это правда, но 0 === false это ложь
Андрейс Губарс
17

Это можно сделать тремя разными способами:

 $a = 'How are you?';

1-стристр ()

 if (strlen(stristr($a,"are"))>0) {
    echo "true"; // are Found
 } 

2- strpos ()

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

3- preg_match ()

 if( preg_match("are",$a) === 1) {
   echo "true"; // are Found
 }
Шашанк Сингх
источник
хорошо, но preg_match рискованно, поскольку может возвращать false или 0. Вы должны проверять наличие === 1 в # 3
Shapeshifter
14

Сокращенная версия

$result = false!==strpos($a, 'are');
Сомванг Соуксаватд
источник
5
Хотя этот фрагмент кода может решить вопрос, в том числе объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код.
Боно
14

Чтобы найти «слово», а не набор букв, которые на самом деле могут быть частью другого слова, хорошим решением будет следующее.

$string = 'How are you?';
$array = explode(" ", $string);

if (in_array('are', $array) ) {
    echo 'Found the word';
}
DJC
источник
5
это не удастся, если $stringэтоAre are, are?
Солнечный
13

Вы должны использовать регистр без учета регистра, поэтому, если введенное значение соответствует smallили capsне имеет значения.

<?php
$grass = "This is pratik joshi";
$needle = "pratik";
if (stripos($grass,$needle) !== false) { 

 /*If i EXCLUDE : !== false then if string is found at 0th location, 
   still it will say STRING NOT FOUND as it will return '0' and it      
   will goto else and will say NOT Found though it is found at 0th location.*/
    echo 'Contains word';
}else{
    echo "does NOT contain word";
}
?>

Здесь стрипос находит иголку в стоге сена без учета случая (маленький / колпачки).

Пример PHPCode с выводом

Pratik
источник
13

Может быть, вы могли бы использовать что-то вроде этого:

<?php
    findWord('Test all OK');

    function findWord($text) {
        if (strstr($text, 'ok')) {
            echo 'Found a word';
        }
        else
        {
            echo 'Did not find a word';
        }
    }
?>
Матиас Ставру
источник
12

Не используйте, preg_match()если вы хотите только проверить, содержится ли одна строка в другой строке. Используйте strpos()или strstr()вместо этого, поскольку они будут быстрее. ( http://in2.php.net/preg_match )

if (strpos($text, 'string_name') !== false){
   echo 'get the string';
}
Винод Джоши
источник
12

Если вы хотите проверить, содержит ли строка несколько специфических слов, вы можете сделать:

$badWords = array("dette", "capitale", "rembourser", "ivoire", "mandat");

$string = "a string with the word ivoire";

$matchFound = preg_match_all("/\b(" . implode($badWords,"|") . ")\b/i", $string, $matches);

if ($matchFound) {
    echo "a bad word has been found";
}
else {
    echo "your string is okay";
}

Это полезно, чтобы избежать спама при отправке электронных писем, например.

Julien
источник
10

Функция strpos работает нормально, но если вы хотите выполнить case-insensitiveпроверку слова в абзаце, вы можете использоватьstripos функцию PHP.

Например,

$result = stripos("I love PHP, I love PHP too!", "php");
if ($result === false) {
    // Word does not exist
}
else {
    // Word exists
}

Найти позицию первого вхождения нечувствительной к регистру подстроки в строке.

Если слово не существует в строке, оно вернет false, иначе вернет позицию слова.

Акшай Хале
источник
9

Вам нужно использовать идентичные / не идентичные операторы, потому что strpos может вернуть 0 в качестве значения индекса. Если вам нравятся троичные операторы, подумайте над тем, чтобы использовать следующее (я думаю, что это немного задом наперед):

echo FALSE === strpos($a,'are') ? 'false': 'true';
Имитатор
источник
8

Проверить, содержит ли строка конкретные слова?

Это означает, что строка должна быть преобразована в слова (см. Примечание ниже).

Один из способов сделать это и указать разделители - использовать preg_split( doc ):

<?php

function contains_word($str, $word) {
  // split string into words
  // separators are substrings of at least one non-word character
  $arr = preg_split('/\W+/', $str, NULL, PREG_SPLIT_NO_EMPTY);

  // now the words can be examined each
  foreach ($arr as $value) {
    if ($value === $word) {
      return true;
    }
  }
  return false;
}

function test($str, $word) {
  if (contains_word($str, $word)) {
    echo "string '" . $str . "' contains word '" . $word . "'\n";
  } else {
    echo "string '" . $str . "' does not contain word '" . $word . "'\n" ;
  }
}

$a = 'How are you?';

test($a, 'are');
test($a, 'ar');
test($a, 'hare');

?>

Бег дает

$ php -f test.php                   
string 'How are you?' contains word 'are' 
string 'How are you?' does not contain word 'ar'
string 'How are you?' does not contain word 'hare'

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

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

Символ «слово» - это любая буква или цифра или символ подчеркивания, то есть любой символ, который может быть частью «слова» Perl. Определение букв и цифр контролируется таблицами символов PCRE и может отличаться, если происходит сопоставление для конкретной локали (..)

MVW
источник
7

Другое решение для конкретной строки:

$subject = 'How are you?';
$pattern = '/are/';
preg_match($pattern, $subject, $match);
if ($match[0] == 'are') {
    echo true;
}

Вы также можете использовать strpos()функцию.

devpro
источник