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



вхождению наличие (25)

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

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

$a = 'How are you?';

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

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


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

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

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

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

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


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

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

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

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

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

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

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

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

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


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

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 .


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

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

Объяснение:

  • strpos() находит положение первого вхождения чувствительной к регистру подстроки в строке.
  • stripos() находит положение первого вхождения подстроки без stripos() регистра в строке.
  • myFunction($haystack, $needle) === FALSE ? FALSE : TRUE myFunction($haystack, $needle) === FALSE ? FALSE : TRUE гарантирует, что myFunction всегда возвращает логическое значение и фиксирует неожиданное поведение, когда индекс подстроки равен 0.
  • $caseSensitive ? A : B $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)

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

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

Это полезно для предотвращения спама при отправке писем, например.


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

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

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

 $a = 'How are you?';

1- stristr ()

 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
 }

Функция strpos работает нормально, но если вы хотите сделать проверку case-insensitive к 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, иначе оно вернет позицию слова.


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

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

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

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

if (in_array('are', $array) ) {
    echo 'Found the word';
}

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

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

$a = 'How are you?';

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

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


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

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

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

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

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

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

  • «Есть» в «Что ты думаешь?»
  • «Есть» в «lol u dunno wut that are4?»

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


Используйте использование case-insensitve, используя stripos() :

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

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

$a = 'How are you?';

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

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


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

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

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

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

Краткосрочная версия

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

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.";
    }
?>

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

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

Один из способов сделать это и указать разделители использует 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 и может варьироваться, если происходит сопоставление по конкретному языку (..)


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

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

Существует string.includes в ES6 :

"potato".includes("to");
> true

Обратите внимание, что вам может потребоваться загрузить es6-shim или аналогичный, чтобы это работало в старых браузерах.

require('es6-shim')




php string substring contains string-matching