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


2661

치다:

$a = 'How are you?';

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

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

답변:


6889

strpos()다른 문자열 내에서 한 문자열의 발생을 찾는 데 사용되는 함수를 사용할 수 있습니다 .

$a = 'How are you?';

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

사용 !== false은 의도적입니다 ( 원하는 결과 != false=== true반환 하지도 않습니다 ). strpos()haystack 문자열에서 바늘 문자열이 시작되는 오프셋 또는 false바늘을 찾을 수없는 경우 부울을 반환합니다. 0은 유효한 오프셋이고 0은 "falsey"이므로보다 간단한 구문을 사용할 수 없습니다 !strpos($a, 'are').


261
파티에 늦었지만 조심하십시오. 문자열 'Do you care?'에 대해서도 true를 반환합니다.
DTest

167
@DTest-물론 문자열에 'are'가 포함되어 있기 때문에 true를 반환합니다. ARE라는 단어를 구체적으로 찾고 있다면, 예를 들어 A 앞과 E 뒤에 문자 나 공백이 있는지 확인하는 등의 추가 점검이 필요합니다.
jsherk

40
위의 아주 좋은 의견! 결국! = 또는 ==을 사용하지 마십시오! 결국! == 및 ===는 모든 옵션 (속도, 정확성 등)을 고려한 최선의 선택입니다.
Melsi

10
@jsherk 그렇다면 왜 정규 표현식을 사용하지 않습니까? ""와 같은 것이 있습니다.
Giulio Muscarello

21
나는 항상 strpos($a, 'are') > -1true를 테스트하기 위해 사용 하여이 문제를 피하는 경향이 있습니다. 디버깅 관점에서 볼 때 연속 등호를 계산할 필요가 없을 때 라인이 올바르게 작성되었는지를 결정하는 데 뇌가 더 적은 클럭 사이클을 낭비한다는 것을 알았습니다.
equazcion

607

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

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

$a = 'How are you?';

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

성능 측면에서 strpos약 3 배 빠르며 한 번에 백만 번 비교를하면 preg_match1.5 초가 strpos걸리고 0.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.
}

9
@ Alexander.Plutov 두 번째로 질문이 아닌 -1을 제공합니까? cmon 답변 google.com/…
Breezer

64
+1 간단한 문자열을 검색하는 끔찍한 방법이지만 SO를 찾는 많은 사람들이 자신의 하위 문자열을 검색 할 수있는 방법을 찾고 있으며 제안이 제기되어 도움이됩니다. OP조차도 지나치게 단순화되었을 수도 있습니다. 대안을 알려주십시오.
SamGoody

72
기술적으로 질문은 하위 문자열이 아닌 단어 를 찾는 방법을 묻습니다 . 정규식 단어 경계와 함께 사용할 수 있기 때문에 실제로 도움이되었습니다. 대안은 항상 유용합니다.

15
strpos는 단 하나의 검사 인 반면에 regpos는 동시에 많은 단어를 검사 할 수 있기 때문에 답은 +1, @ plutov.by 주석에 -1은 예 : preg_match (/ are | you | not /)
albanx

4
정규식은 최후의 수단이어야합니다. 사소한 작업에서 사용하지 않는 것이 좋습니다. 나는 수년간의 나쁜 코드 파기의 높이에서 이것을 주장한다.
yentsun

256

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

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

74
@RobinvanBaalen 실제로는 코드 가독성을 향상시킬 수 있습니다. 또한 다운 보트는 "중립적 인"답변이 아닌 (매우) 나쁜 답변에 대한 것으로 간주됩니다.
Xaqq

37
@RobinvanBaalen 함수는 거의 가독성을 위해 정의되어 있습니다 (하고있는 일의 아이디어를 전달하기 위해). 더 읽기 쉬운 비교 : if ($email->contains("@") && $email->endsWith(".com)) { ...또는if (strpos($email, "@") !== false && substr($email, -strlen(".com")) == ".com") { ...
Brandin

3
최종 규칙에서 @RobinvanBaalen은 깨지기위한 것입니다. 그렇지 않으면 사람들은 새로운 창의적 방법으로 일을하지 않을 것입니다 :). 또한 martinfowler.com과 같은 것들로 마음을 감싸는 데 어려움이 있음을 인정해야합니다. 옳은 일을 직접 시도해보고 가장 편리한 접근 방법을 찾는 것입니다.
James P.

5
또 다른 의견 : 쉽게 랩핑 할 수있는 유틸리티 기능이 있으면 디버깅에 도움이 될 수 있습니다. 또한 생산 서비스에서 이러한 오버 헤드를 제거하는 우수한 옵티 마이저를 요구합니다. 따라서 모든 의견은 유효합니다. ;)
Tino

18
물론 이것은 유용하다. 이것을 권장해야합니다. PHP 100에서 문자열 위치를 찾는 새롭고 빠른 방법이 있다면 어떻게됩니까? strpos라고 부르는 모든 장소를 바꾸시겠습니까? 또는 함수 내 포함 만 변경 하시겠습니까 ??
Cosmin

143

보통이 아니다 당신의 문자열의 하위 문자열이 나타납니다 당신이 특정 찾고 있다면 원하는 경우 이러한 답변의 대부분은 당신을 말할 것이다 동안 단어 A,하지 문자열 .

차이점이 뭐야? 하위 문자열은 다른 말로 나타날 수 있습니다.

  • "지역"의 시작 부분에있는 "지역"
  • "거기"의 끝에 "있다"
  • "운임"의 중간에 "있다"

이를 완화하는 한 가지 방법은 단어 경계 ( \b) 와 결합 된 정규식을 사용하는 것입니다 .

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

이 방법에는 위에서 언급 한 것과 같은 오 탐지가 없지만 고유 한 경우가 있습니다. 단어 경계는 단어가 아닌 문자 (에 일치 \W하지 않습니다 아무것도 할 예정), a-z, A-Z, 0-9, 또는 _. 즉, 숫자와 밑줄이 단어 문자로 계산되며 이와 같은 시나리오는 실패합니다.

  • "당신은 무엇을 생각하고 있습니까?"
  • "lol u dunno wut that are are4"의 "are"는 무엇입니까?

이보다 더 정확한 것을 원한다면 영어 구문 구문 분석을 시작해야합니다. 그리고 그것은 꽤 큰 웜 캔입니다 (그리고 항상 주어진 것은 아니지만 구문을 올바르게 사용한다고 가정합니다).


24
이것은 정식 답변이어야합니다. 하위 문자열이 아닌 단어를 찾고 있기 때문에 정규식이 적합합니다. 나는 또한 추가 할 것입니다 일치에게 두 가지를 찾는 것이 큰하게하는,하지 않는을 단어를 문자열 : 그것은 문자열의 시작과 일치 ( ) 및 문자열 (끝 )\b\W^$
code_monk

이 정답해야합니다 .. 답변의 나머지 부분은 "당신이 상관 할"와 같은 문자열에 "있다"찾을 것입니다 ..로는 @Dtest 언급
로버트 싱클레어

@RobertSinclair 너무나 나쁜가요? "do you care"라는 문자열에 "are"라는 단어가 포함되어 있는지 물으면 "yes"라고 말합니다. "are"라는 단어는 분명히 해당 문자열의 하위 문자열입니다. 이것은 "" "와는 별개의 질문입니다." "당신은"Do you care "" "" ""의 단어 중 하나입니다.
Paul

@Paulpro EventOP가 $ a를 문구로 지정하지 않았지만, 이것이 암시 된 것 같습니다. 그래서 그의 질문은 어구 안에서 단어를 탐지하는 방법이었습니다. 단어 안에 단어가 들어있는 경우에는 그렇지 않습니다.
Robert Sinclair

@Jimbo 작동합니다 .`
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을 반환하고 ==작동하지 않는 비교를 수행하면===

==기호 왼쪽 변수 / 표현 / 상수 우측 가변 / 표현 / 상수와 동일한 값을 가지고 있는지를 비교하고 테스트한다.

===기호는 두 변수 / expresions / 상수가 동일한 지 여부를 확인하는 비교입니다 AND같은 유형이 - 즉, 두 문자열 또는 둘 다 정수입니다.


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()검색을해야하는 경우 사례를 구분 또 다른 옵션이 될 것입니다.


9
상의주의 사항 php.net/manual/en/function.strstr.php의 참고 : 페이지는 특정 바늘 건초 더미 내에서 발생하는지만을 확인하려한다면, 더 빠르고 적은 메모리 집약적 인 기능 strpos () 대신 사용합니다.
Jo Smo

@tastro 이것에 대한 평판이 좋은 벤치 마크가 있습니까?
Wayne Whitty 2016 년

이 속도는 느릴 수 있지만 IMHO strstr($a, 'are')는 추악한 것보다 훨씬 우아합니다 strpos($a, 'are') !== false. PHP에는 실제로 str_contains()함수 가 필요 합니다.
Paul Spiegel

이 답변이 허용되지 않는다는 생각이
듭니다


45

SamGoody와 Lego Stormtroopr의 의견을 인용하십시오.

여러 단어의 근접성 / 관련성따라 검색 결과의 순위매기 는 PHP 알고리즘을 찾고 있다면 PHP로만 검색 결과를 생성하는 빠르고 쉬운 방법이 있습니다.

다른 부울 검색 방법과 관련된 문제 등 strpos(), preg_match(), strstr()또는stristr()

  1. 여러 단어를 검색 할 수 없습니다
  2. 결과는 순위가 없습니다

Vector Space Modeltf-idf (term frequency-inverse document frequency) 기반 PHP 방법 :

어렵지만 놀랍도록 쉽습니다.

문자열에서 여러 단어를 검색하려면 핵심 문제는 각 단어에 가중치를 할당하는 방법입니다.

문자열 전체의 대표성을 기준으로 문자열의 용어에 가중치를 부여 할 수 있으면 쿼리와 가장 일치하는 결과로 결과를 정렬 할 수 있습니다.

이것은 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().

NOTA BENE

선택적으로 단어를 검색하기 전에 중복성을 제거

  • 따라서 인덱스 크기를 줄이고 스토리지 요구 사항을 줄입니다.

  • 적은 디스크 I / O

  • 더 빠른 색인 생성 및 결과적으로 더 빠른 검색.

1. 정규화

  • 모든 텍스트를 소문자로 변환

2. 스톱 워드 제거

  • 실제 의미가없는 텍스트에서 단어를 제거하십시오 (예 : 'and', 'or', 'the', 'for'등)

3. 사전 대체

  • 동일하거나 유사한 의미를 가진 다른 단어로 바꾸십시오. (예 : '배고픈'및 '배고픈'인스턴스를 '배고픔'으로 대체)

  • 단어를 필수 의미로 추가로 줄이기 위해 추가 알고리즘 측정 (스노우 볼)이 수행 될 수 있습니다.

  • 색상 이름을 16 진수로 대체

  • 정밀도를 줄임으로써 숫자 값을 줄이는 것은 텍스트를 정규화하는 다른 방법입니다.

자원


40

"falsey"및 "truthy"문제를 피하려면 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 () 함수를 사용 하십시오 .


1
바늘을 찾을 수 없으면 strstr ()은 FALSE를 반환합니다. 따라서 strlen은 필요하지 않습니다.
Ayesh K

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

3
다음과 같은 경고가 나타납니다.WARNING preg_match(): Delimiter must not be alphanumeric or backslash
Pathros

27

나는 여기에 사용 된 답변 중 어느 것도 사용하지 않았다는 것에 약간 감동했습니다. strpos , strstr유사한 기능을 언급 한 멀티 바이트 문자열 함수를 아직 (2015년 5월 8일).

기본적 으로 독일어, 프랑스어, 포르투갈어, 스페인어 등과 같은 일부 언어에 특정한 문자가있는 단어를 찾는 데 어려움 이있는 경우 (예 : ä , é , ô , ç , º , ñ ) 로 기능 mb_. 따라서 허용되는 답변은 대신 mb_strpos또는 mb_stripos(대소 문자를 구분하지 않는 일치)를 사용합니다.

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

모든 데이터가 UTF-8로 100 % 임을 보장 할 수없는 경우 mb_함수 를 사용할 수 있습니다.

Joel Spolsky의 유니 코드 및 문자 집합 (변명 없음)대해 절대적으로 모든 소프트웨어 개발자가 절대적 으로 알아야하는 이유를 이해하는 좋은 기사 입니다.


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 : TRUEmyFunction부울 을 항상 반환하고 부분 문자열의 인덱스가 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도 그런 일을 기준으로, 또한, 난 그냥 지식을 조금 공유를위한 담당자를 위해 그것을 게시하지 않았다
제이슨 OOO를

마지막 var_dump가 false
Sunny

1
@Sunny : 오타였습니다 : var_dump (is_str_contain ( "mystringss", "strings")); // true
Jason OOO

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$bcontains를 포함 $c하고 있지만 함수에 $a포함 된 것만 알려줄 수도 있습니다 $c.


1
당신은 아마 의미 : $found = false처음에

1
단어가 쉼표, 물음표 또는 점으로 연결되어 있으면 기능이 작동하지 않을 수 있습니다. 예를 들어 "당신이 보는 것은 당신이 얻는 것입니다." "get"이 문장에 있는지 확인하려고합니다. "get"옆의 전체 정지를 확인하십시오. 이 경우 함수는 false를 반환합니다. 문자열을 검색 / 교체하려면 정규 표현식 또는 substr (어쨌든 정규 표현식을 사용한다고 생각합니다)을 사용하는 것이 좋습니다.
lightbringer

@lightbringer 당신은 당신의 추천에 더 이상 틀릴 수 없었습니다, 그것은 당신이 "추천"에 대해 무엇을 의미합니까? 추천하거나 찬성하는 최고의 사람은 없습니다. 그것은 언어 자체의 블랙홀 인 PHP에서 정규 표현식 엔진을 사용하는 것에 관한 것입니다. 정규식 일치를 루프에 넣고 결과를 벤치 마크하려고 할 수 있습니다.
Decebal

이 답변은 잘 설명되지 않았으며 많은 확장 시나리오에서 실패합니다. 이 기술을 접대 할 때 어떤 이점도 얻지 못합니다. 다음은 개선 된 커스텀 함수와 반복 호출입니다. 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';
?>

이것은 거꾸로입니다. i에는 stristr영향을받지 의미합니다.
Adam Merrifield

18

사용하는 많은 답변 substr_count은 결과가 확인합니다 >0. 그러나 if명령문은 0 을 false와 동일하게 간주 하므로 해당 검사를 피하고 직접 쓸 수 있습니다.

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

존재 하지 않는지 확인하려면 !연산자를 추가하십시오 .

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

글쎄 ... PHP에서 부분적으로 true 0 == false는 true이지만 0 === false는 false
Andrejs Gubars

17

세 가지 방법으로 수행 할 수 있습니다.

 $a = 'How are you?';

1- 스트리스트 ()

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

2- 스트랩 ()

 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을 반환 할 수 있으므로 위험합니다. # 3에서 === 1을 테스트해야합니다.
Shapeshifter

14

속기 버전

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

5
이 코드 스 니펫은 문제를 해결할 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다. 앞으로 독자들에게 질문에 대한 답변을 제공하므로 해당 사람들이 코드 제안의 이유를 모를 수도 있습니다.
Bono

14

실제로 다른 단어의 일부가 될 수있는 일련의 문자가 아닌 '단어'를 찾으려면 다음과 같은 방법이 좋습니다.

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

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

5
그것은 실패합니다 $stringISAre 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";
}
?>

여기서 stripos는 대소 문자 고려 하지 않고 heystack에서 needle을 찾습니다 .

출력이있는 PHPCode 샘플


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

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


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의 문자표에 의해 제어되며 로케일 별 일치가 발생하는 경우 달라질 수 있습니다 (..)


7

특정 문자열에 대한 또 다른 솔루션 :

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

strpos()기능 을 사용할 수도 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.