문자열에 특정 단어가 포함되어 있는지 확인하려면 어떻게 해야 합니까?

고려사항:

$a = 'How are you?';  if ($a contains 'are')     echo 'true'; 

위의 코드가 있다고 가정하면, 스테이트먼트를 작성하는 올바른 방법은 무엇입니까?if ($a contains 'are')?



질문에 대한 답변



PHP 8에서는 str_contains를 사용하여 이 작업을 수행할 수 있습니다.

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

RFC

PHP 8 이전

다음 함수를 사용하여 어떤 문자열이 다른 문자열 내에서 발생하는지 확인할 수 있습니다.

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

주의:!== false의도적(의도적)!= false도 아니다=== true원하는 결과를 반환한다).strpos()니들 문자열이 건초 스택 문자열로 시작되는 오프셋 또는 부울 중 하나를 반환합니다.false바늘이 발견되지 않으면요0은 유효한 오프셋이고 0은 “false”이기 때문에 다음과 같은 간단한 구문을 사용할 수 없습니다.!strpos($a, 'are').




단어 매칭이 더 좋기 때문에 정규 표현을 사용할 수 있습니다.strpos(다른 유저에 의해서 기재되어 있습니다.astrpos을 조사하다.are또한 요금, 관리, 응시 등의 문자열에 대해서도 true가 반환됩니다.이러한 의도하지 않은 일치는 단어 경계를 사용함으로써 정규 표현에서 간단히 피할 수 있습니다.

의 간단한 매칭are다음과 같이 될 수 있습니다.

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

퍼포먼스 측면에서는strpos약 3배 빠릅니다.한 번에 100만번 비교해보니까 1.5초 걸려서strpos0.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. } 

한 가지 더 명심해야 할 것은b영어 이외의 다른 언어에서는 동작하지 않습니다.

이것과 솔루션에 대한 설명은 여기서 인용합니다.

b는 단어의 시작 또는 끝을 나타냅니다(단어 경계).이 정규식은 애플 파이에는 사과와 매치되지만 파인애플, 애플카트, 베이크애플에는 매치되지 않습니다.

카페는 어때?‘카페’라는 단어를 정규식으로 추출하려면 어떻게 해야 하죠?사실, bcafé는 작동하지 않아요. 왜요?카페에는 ASC 이외의 것이 포함되어 있기 때문에II 문자: é. b는 단순히 유니코드, as, ., 😉와 같이 사용할 수 없습니다.

유니코드 문자를 추출하려면 단어 경계를 나타내는 문자를 직접 정의해야 합니다.

답은 다음과 같습니다.(?<=[s,.:;"'] ^)UNICODE_WORD(?=[s,.:;"'] $)

따라서 PHP에서 답변을 사용하려면 다음 함수를 사용할 수 있습니다.

function contains($str, array $arr) {     // Works in Hebrew and any other unicode characters     // Thanks https://medium.com/@shiba1014/regex-word-boundaries-with-unicode-207794f6e7ed     // Thanks https://www.phpliveregex.com/     if (preg_match('/(?<=[s,.:;"'] ^)' . $word . '(?=[s,.:;"'] $)/', $str)) return true; } 

단어 배열을 검색하려면 다음을 사용할 수 있습니다.

function arrayContainsWord($str, array $arr) {     foreach ($arr as $word) {         // Works in Hebrew and any other unicode characters         // Thanks https://medium.com/@shiba1014/regex-word-boundaries-with-unicode-207794f6e7ed         // Thanks https://www.phpliveregex.com/         if (preg_match('/(?<=[s,.:;"'] ^)' . $word . '(?=[s,.:;"'] $)/', $str)) return true;     }     return false; } 

PHP 8.0.0 이후 str_contains를 사용할 수 있게 되었습니다.

<?php     if (str_contains('abc', '')) {         echo "Checking the existence of the empty string will always          return true";     } 



여기 이런 경우에 유용한 작은 유틸리티 기능이 있습니다.

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



문자열에 다른 문자열이 포함되어 있는지 여부를 확인하려면 PHP 함수를 사용합니다.

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 ===부호는 두 변수/표현/상수가 동일한지 여부를 확인하는 비교입니다.AND유형이 같습니다. 즉, 둘 다 문자열이거나 둘 다 정수입니다.




이러한 답변의 대부분은 문자열에 하위 문자열이 표시되는지 여부를 알려 주지만, 하위 문자열이 아닌 특정 단어를 찾는 경우에는 일반적으로 원하는 단어가 아닙니다.

뭐가 다른데?하위 문자열은 다음 단어로 표시될 수 있습니다.

  • “area”의 선두에 있는 “are”
  • “hare”의 끝에 있는 “are”는
  • ‘운임’의 한복판에 있는 ‘현상’

이를 완화하기 위한 한 가지 방법은 정규 표현을 단어 경계와 조합하여 사용하는 것입니다.b):

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

이 메서드는 위에서 설명한 것과 동일한 false positive를 가지고 있지 않지만 자체 엣지 케이스가 있습니다.단어 경계는 단어가 아닌 문자와 일치합니다(W( )이러한 것은, 다른 것이 됩니다.a-z,A-Z,0-9, 또는_즉, 숫자와 밑줄이 워드 문자로 카운트되고 다음과 같은 시나리오가 실패합니다.

  • “무슨 생각을 하고 있니?”의 “지금”은?
  • “lol u donno wut thats 4?”의 “are”는?

이것보다 더 정확한 것을 원한다면 영어 구문 해석을 시작해야 합니다.그것은 상당히 많은 웜입니다(어쨌든 구문을 적절하게 사용하는 것은 항상 정해진 것은 아닙니다).