strpos에서 배열을 바늘로 사용


91

strpos문자열을 검색 할 때 바늘 배열에를 어떻게 사용 합니까? 예를 들면 :

$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';

if(strpos($string, $find_letters) !== false)
{
    echo 'All the letters are found in the string!';
}

이거 사용하면 안 되니까 이런게 있으면 좋을 텐데

답변:


138

@Dave는 http://www.php.net/manual/en/function.strpos.php#107351 에서 업데이트 된 스 니펫을

function strposa($haystack, $needles=array(), $offset=0) {
        $chr = array();
        foreach($needles as $needle) {
                $res = strpos($haystack, $needle, $offset);
                if ($res !== false) $chr[$needle] = $res;
        }
        if(empty($chr)) return false;
        return min($chr);
}

사용하는 방법:

$string = 'Whis string contains word "cheese" and "tea".';
$array  = array('burger', 'melon', 'cheese', 'milk');

if (strposa($string, $array, 1)) {
    echo 'true';
} else {
    echo 'false';
}

true때문에 반환됩니다 array "cheese".

업데이트 : 첫 번째 바늘이 발견되면 중지로 코드를 개선했습니다.

function strposa($haystack, $needle, $offset=0) {
    if(!is_array($needle)) $needle = array($needle);
    foreach($needle as $query) {
        if(strpos($haystack, $query, $offset) !== false) return true; // stop on first true result
    }
    return false;
}
$string = 'Whis string contains word "cheese" and "tea".';
$array  = array('burger', 'melon', 'cheese', 'milk');
var_dump(strposa($string, $array)); // will return true, since "cheese" has been found

1
@Arnaud, 제안 된 구현은 무엇입니까?
Binyamin

5
확실하지 않지만 $ offset에서 문자열로 진행하여 첫 번째 바늘이 발견되면 중지 할 수 있습니다. "a"로 가득 찬 큰 텍스트를 생각해보십시오. $ needles = [a, b]를 가져옵니다. 귀하의 함수 strposa는 모든 텍스트를 통해 실행되지만 반드시 필요한 것은 아닙니다! 이해할 수 있습니까?
Arnaud 2013 년

기능 제안에 대해 @Arnaud에게 감사드립니다! 귀하의 제안 중요성에 전적으로 동의하며 개선 된 코드 예제로 제 답변을 업데이트했습니다.
Binyamin

새로운 함수 $ needles = [b, a]에는 아직 문제가 있고 함수가 더 이상 첫 번째 발생 위치를 반환하지 않기 때문에 이것은 제가 말하고 싶은 것이 아닙니다. 좀 더 설명하겠습니다. 문자열이 "ABCDEF"이고 바늘이 C와 F라고 가정합니다. 우리가 할 수있는 것은 문자열을 통해 실행하는 것입니다 : A, B ... C! C를 감지하므로 여기서 멈추고 바늘의 첫 번째 발생 위치 인 2를 반환 할 수 있습니다. 단일 문자열 이상에서 작동 할 수 있지만 정확한 구현에 대해서는 생각하지 않았습니다.
Arnaud 2013 년

1
을 변경하여 코드를 개선 foreach($needle as $k => $query) { if(strpos($haystack, $query, $offset) !== false) return $k; }했으므로 추가 처리를 위해 일치하는 항목의 키를 반환합니다.
James Cameron

53

str_replace는 상당히 빠릅니다.

$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';
$match = (str_replace($find_letters, '', $string) != $string);

구문 오류 : 3 번 줄에 닫는 대괄호 1 개가 너무 많습니다 (6 자 이상의 편집 요구 사항으로 인해 위 코드에서 직접 수정할 수 없습니다.))
richey

1
죄송합니다. 지금 수정되었습니다. 머리 위로 건배!
Leon

7
최고의 솔루션 중 하나!
andys

18

아래 코드는이를 수행하는 방법을 보여줄뿐만 아니라 사용하기 쉬운 기능에 추가합니다. "jesda"에 의해 작성되었습니다. (온라인에서 찾았습니다)

PHP 코드 :

<?php
/* strpos that takes an array of values to match against a string
 * note the stupid argument order (to match strpos)
 */
function strpos_arr($haystack, $needle) {
    if(!is_array($needle)) $needle = array($needle);
    foreach($needle as $what) {
        if(($pos = strpos($haystack, $what))!==false) return $pos;
    }
    return false;
}
?>

용법:

$needle = array('something','nothing');
$haystack = "This is something";
echo strpos_arr($haystack, $needle); // Will echo True

$haystack = "This isn't anything";
echo strpos_arr($haystack, $needle); // Will echo False 

나는 이것이 찾은 첫 번째 위치 만 반환한다고 믿습니다. 건초 더미의 모든 바늘 위치를 반환하도록 조정하는 방법에 대한 제안이 있습니까?
Chaya Cooper

7

배열을 반복하고를 strpos반환하는 경우 "플래그"값을 설정할 수 있습니다 false.

$flag = false;
foreach ($find_letters as $letter)
{
    if (strpos($string, $letter) === false)
    {
        $flag = true;
    }
}

그런 다음의 값을 확인하십시오 $flag.


6
!== flase그래?
Joe Huang

! == false 여야합니다. 플래그를 true로 설정 한 직후에 깨지지 않는 한. 그런 다음 플래그를 건초 더미에 바늘이 없다는 경고로 해석해야합니다. 즉, 달성하려는 것은 모든 바늘이 건초 더미에 있는지 확인하는 것입니다. 질문이 아닙니다. 그래서 .. 그래. ! == 거짓
케빈 Gagnon의

5

특정 문자가 실제로 문자열에 있는지 확인하려면 strtok 사용하십시오 .

$string = 'abcdefg';
if (strtok($string, 'acd') === $string) {
    // not found
} else {
    // found
}

놀라운 답변-여러 strpos ()보다 훨씬 빠른 실행, 예 : if (strpos ($ string, "a")! == false && strpos ($ string, "c")! == false && strpos ($ string, " d ")! == false)
한 ChemistryBlob

5

질문은 제공된 예제가 단지 "예"일 뿐입니 까 아니면 정확히 찾고있는 것입니까? 여기에는 여러 가지 혼합 된 답변이 있으며 허용되는 답변의 복잡성을 이해하지 못합니다.

여부를 확인하려면 모든 컨텐츠 바늘의 배열이 문자열에 존재하고 신속하게 참 또는 거짓을 반환합니다 :

$string = 'abcdefg';

if(str_replace(array('a', 'c', 'd'), '', $string) != $string){
    echo 'at least one of the needles where found';
};

그렇다면 @Leon 에게 크레딧을 제공하십시오 .

여부를 확인하려면 ALL의바늘의 배열이 존재하는 이 경우에서와 같이 문자열에, 세 가지를 모두 'a', 'b'하고 'c'당신이 언급처럼, 존재해야합니다 귀하의 "예"로

echo '문자열에서 모든 글자를 찾았습니다!';

여기에 많은 답변이 그 맥락에서 벗어 났지만 해결 된 것으로 표시 한 질문의 의도가 의심됩니다. 예 : 허용되는 대답은 다음의 바늘입니다.

$array  = array('burger', 'melon', 'cheese', 'milk');

모든 단어 가 문자열에서 반드시 발견되어야 한다면 ?

그런 다음 "not accepted answers"이 페이지 에서 몇 가지를 시도해보십시오 .


내 배열에 하위 문자열이 포함되어 있기 때문에 이것은 완벽하게 작동했습니다. 나는 "%의 $ 문자열 %"와 같은 쓰기 SQL 명령에서 저장 한
모리스 Elagu

4

이 표현식은 모든 문자를 검색합니다.

count(array_filter( 
    array_map("strpos", array_fill(0, count($letters), $str), $letters),
"is_int")) == count($letters)

3

이것을 시도 할 수 있습니다.

function in_array_strpos($word, $array){

foreach($array as $a){

    if (strpos($word,$a) !== false) {
        return true;
    }
}

return false;
}

1

부정을 위해 strpbrk () 를 사용해 볼 수도 있습니다 (문자가 하나도 발견되지 않았습니다) :

$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';

if(strpbrk($string, implode($find_letters)) === false)
{
    echo 'None of these letters are found in the string!';
}

1

이것이 내 접근 방식입니다. 일치하는 항목을 찾을 때까지 문자열의 문자를 반복합니다. 더 큰 바늘 배열에서는 일치가 발견되었는지 확인하기 위해 모든 바늘을 확인할 필요가 없기 때문에 허용되는 답변보다 성능이 뛰어납니다.

function strpos_array($haystack, $needles = [], $offset = 0) {
    for ($i = $offset, $len = strlen($haystack); $i < $len; $i++){
        if (in_array($haystack[$i],$needles)) {
            return $i;
        }
    }
    return false;
}

나는 이것을 받아 들인 대답과 비교하여 벤치마킹했으며 7 개 이상의 배열로 $needles이것은 극적으로 빨랐습니다.


0

다음 코드로 :

$flag = true;
foreach($find_letters as $letter)
    if(false===strpos($string, $letter)) {
        $flag = false; 
        break;
    }

그런 다음의 값을 확인하십시오 $flag. 이면 true모든 문자가 발견 된 것입니다. 그렇지 않은 경우 false.


0

나는 나와 비슷한 것을 찾는 사람에게 도움이되기를 희망하는 새로운 답변을 쓰고 있습니다.

이것은 "나는 여러 개의 바늘을 가지고 있고 그것들을 사용하여 단일 문자열을 찾으려고합니다"의 경우에 작동합니다. 그리고 이것이 제가 그것을 찾기 위해 만난 질문입니다.

    $i = 0;
    $found = array();
    while ($i < count($needle)) {
        $x = 0;
        while ($x < count($haystack)) {
            if (strpos($haystack[$x], $needle[$i]) !== false) {
                array_push($found, $haystack[$x]);
            }
            $x++;
        }
        $i++;
    }

    $found = array_count_values($found);

배열 $found에는 일치하는 모든 바늘의 목록이 포함되며, 가장 높은 개수 값을 가진 배열의 항목은 찾고있는 문자열이됩니다. 다음과 같이 얻을 수 있습니다.

print_r(array_search(max($found), $found));

0

@binyamin 및 @Timo .. (코멘트를 추가 할 포인트가 충분하지 않습니다 ..)에 회신하지만 결과에 위치가 포함되어 있지 않습니다.
아래 코드는 strpos가 의도 한 첫 번째 요소의 실제 위치를 반환합니다. 하다. 정확히 1 개의 일치 항목을 찾을 것으로 예상하는 경우 유용합니다. 여러 일치 항목을 찾을 것으로 예상하는 경우 처음 찾은 위치는 의미가 없을 수 있습니다.

function strposa($haystack, $needle, $offset=0) {
    if(!is_array($needle)) $needle = array($needle);
    foreach($needle as $query) {
      $res=strpos($haystack, $query, $offset);
      if($res !== false) return $res; // stop on first true result
    }
    return false;
}

0

위의 답변에서 업그레이드

function strsearch($findme, $source){
    if(is_array($findme)){
        if(str_replace($findme, '', $source) != $source){
            return true;
        }
    }else{
        if(strpos($source,$findme)){
            return true;
        }
    }
    return false;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.