it-swarm.com.ru

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

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

$a = 'How are you?';

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

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

2665
Charles Yeung

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

$a = 'How are you?';

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

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

6198
codaddict

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

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

$a = 'How are you?';

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

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

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

$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.
}
538
Breezer

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

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

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

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

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

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

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

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

  • "Есть" в "Что _are_ вы думаете?"
  • "Есть" в "LOL U DUNNO WUT те are4?"

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

128
FtDRbwLXw6

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

111
Jose Vega

посмотрите на 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.";
    }
?>
60
Haim Evgi

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

58
glutorange

Посмотрите на комментарии 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. Подстановка словаря

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

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

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

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

РЕСУРСЫ

43
RafaSashi

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

if (stripos($string,$stringToSearch) !== false) {
    echo 'true';
}
42
Shankar Damodaran

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

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

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

40
Alan Piralla

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

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

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

31
YashG99

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

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

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

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

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

28
Armfoot
if (preg_match('/(are)/', $a)) {
   echo 'true';
}
28
joan16v

Функция ниже также работает и не зависит от какой-либо другой функции; он использует только нативную 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 
23
Jason OOO

В 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
John Slegers

Вы можете использовать функцию 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 ";
}
21
Arshid KV

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

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;
 }

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

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

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

21
Decebal

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

<?php
    $a = 'How are you?';
    if (strstr($a,'are'))  // Case sensitive
        echo 'true';
    if (stristr($a,'are'))  // Case insensitive
        echo 'true';
?>
17
Sadikhasan

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

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

if (in_array('are', $array) ) {
    echo 'Found the Word';
}
14
DJC

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

 $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
 }
14
Shashank Singh

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

$result = false!==strpos($a, 'are');
14
Somwang Souksavatd

Вы должны использовать регистр без учета регистра, поэтому, если введенное значение находится в 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";
}
?>

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

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

13
Pratik C Joshi

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

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

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

if (!substr_count($a, 'are')) {
13
T30

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

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

    function findWord($text) {
        if (strstr($text, 'ok')) {
            echo 'Found a Word';
        }
        else
        {
            echo 'Did not find a Word';
        }
    }
?>
12
Mathias Stavrou

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

if (strpos($text, 'string_name') !== false){
   echo 'get the string';
}
11
Vinod Joshi

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

$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";
}

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

11
Julien

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

Например,

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

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

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

10
Akshay Khale

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

echo FALSE === strpos($a,'are') ? 'false': 'true';
9
Shapeshifter

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

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

Один из способов сделать это и указать разделители - использовать 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'

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

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

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

8
mvw

Строка может быть проверена с помощью следующей функции:

function either_String_existor_not($str, $character) {
    if (strpos($str, $character) !== false) {
        return true;
    }
    return false;
}
7
M Razwan

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

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

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

6
devpro

Использование:

$text = 'This is a test';
echo substr_count($text, 'is'); // 2

// So if you want to check if is exists in the text just put
// in a condition like this:
if (substr_count($text, 'is') > 0) {
    echo "is exists";
}
5
Kamaro Lambert

Более простой вариант:

return ( ! empty($a) && strpos($a, 'are'))? true : false;
4
ShirleyCC

Я думаю, что хорошей идеей является использование mb_stpos:

$haystack = 'How are you?';
$needle = 'are';

if (mb_strpos($haystack, $needle) !== false) {

    echo 'true';
}

Потому что это решение чувствительно к регистру и безопасно для всех символов Юникода.


Но вы также можете сделать это следующим образом ( ответ sauch еще не был ):

if (count(explode($needle, $haystack)) > 1) {

    echo 'true';
}

Это решение также чувствительно к регистру и безопасно для символов Юникода.

Кроме того, вы не используйте отрицание в выражении, что повышает читаемость кода.


Вот другое решение используя функцию:

function isContainsStr($haystack, $needle) {

    return count(explode($needle, $haystack)) > 1;
}

if (isContainsStr($haystack, $needle)) {

    echo 'true';
}
4
simhumileco

Использование:

$a = 'How are you?';
if (mb_strpos($a, 'are')) {
    echo 'true';
}

Он выполняет многобайтовую безопасную операцию strpos ().

3
Mindexperiment

Вы также можете использовать встроенные функции strchr() и strrchr() и расширения для многобайтовых строк mb_strchr() и mb_strrchr() . Эти функции возвращают части строк и FALSE, если ничего не найдено.

  • strchr() - Найти первое вхождение строки (это псевдоним strstr() ).
  • strrchr() - Найти последнее вхождение символа в строку.
3
Aleksey Bykov