[php] 문자열에 특정 단어가 포함되어 있는지 어떻게 확인합니까?


Answers

정규 표현식을 사용할 수 있습니다. 다른 사용자가 언급 한 것처럼 strpos에 비해 단어 일치가 더 좋습니다. 운임, 치료, 응시 등과 같은 문자열에도 true를 반환합니다. 정규 표현식에서는 단어 경계를 사용하여 피할 수 있습니다.

간단한 일치는 다음과 같이 보일 수 있습니다.

$a = 'How are you?';

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

성능면에서 strpos는 약 3 배 빨라졌고 마음 속에서 한 번에 100 만회를 비교했을 때 1.5 초로 경기가 끝났고 strpos에는 0.5 초가 걸렸습니다.

Question

중히 여기다:

$a = 'How are you?';

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

위 코드를 가지고 있다고 가정 if ($a contains 'are') 문장을 작성하는 올바른 방법은 무엇입니까?




또 다른 옵션은 strstr() 함수를 사용하는 것입니다. 같은 것 :

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

주의 할 점 : strstr () 함수는 대소 문자를 구분합니다. 대 / 소문자를 구분하지 않고 검색하려면 stristr() 함수를 사용 stristr() .




어쩌면 당신은 이런 식으로 사용할 수 있습니다 :

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

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



한 문자열이 다른 문자열에 포함되어 있는지 확인하려는 경우 preg_match() 사용하지 마십시오. 더 빨라질수록 strpos() 또는 strstr() 대신 사용 strpos() . ( http://in2.php.net/preg_match )

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



아래의 함수도 작동하며 다른 함수에 종속되지 않습니다. 네이티브 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 



다음과 같은 상황에서 유용 할 수있는 작은 유틸리티 함수가 있습니다.

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



stripos() 사용하여 대소 문자 일치를 사용합니다.

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



substr_count 를 사용하는 많은 답변은 결과가 >0 인지 확인합니다. 그러나 if은 false와 동일한 0을 고려하기 때문에 검사를 피하고 직접 작성할 수 있습니다.

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

존재 하지 않는지 확인하려면 ! 운영자:

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



strstr()stristr() 사용하여 문자열에서 단어의 발생을 찾는 또 다른 옵션은 다음과 같습니다.

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



나는 이것에 약간의 문제가 있었고 마침내 나는 내 자신의 해결책을 창조하기로 결정했다. 정규 표현식 엔진을 사용하지 않고 :

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 포함한다고 말할 수 있습니다.




문자열에 몇 가지 구체적인 단어가 포함되어 있는지 확인하려면 다음을 수행 할 수 있습니다.

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

예를 들어 이메일을 보낼 때 스팸을 피하는 데 유용합니다.




대소 문자를 구분하지 않는 형식을 사용해야합니다. 입력 된 값이 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는 case 고려 하지 않고 heystack에서 바늘을 찾습니다 (small / caps).

출력이있는 PHPCode 샘플




문자열에 다른 문자열이 포함되어 있는지 확인하려면 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을 반환합니다. == 비교하면 효과가 없을 것입니다. ===

A == 부호는 비교이며 왼쪽 변수 / 표현식 / 상수가 오른쪽 / 변수 / 표현식 / 상수와 동일한 값을 갖는지 여부를 테스트합니다.

A === 부호는 두 개의 변수 / expresions / constant가 같은지 AND 같은 타입인지를 비교하는 것입니다 - 즉, 둘 다 문자열이거나 둘 다 정수입니다.




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($haystack, $needle) === FALSE ? FALSE : TRUE 는 부분 문자열의 인덱스가 0 일 때 myFunction 항상 부울을 반환하고 예기치 않은 동작을 수정하도록합니다.
  • $caseSensitive ? A : B $caseSensitive ? A : B$caseSensitive 의 값에 따라 작업을 수행하기 위해 strpos() 또는 stripos() 를 선택합니다.

산출:

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)



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



Related



Tags

php php   string