2012-05-21 3 views
0

배열에 단어 목록이 있습니다. 문자열에 이러한 단어가 있는지 확인하는 가장 빠른 방법은 무엇입니까?배열 요소가 문자열에 있는지 확인하는 방법

현재 foreach 루프를 통해 하나씩 배열 요소의 존재를 확인하고 있습니다 (stripos). 더 빠른 방법이 있다면 궁금합니다. 배열을 사용하여 str_replace을 처리하는 것과 같습니다.

+0

일치하는 항목이 있는지 알고 싶습니까? 아니면 일치하는 항목 (또는 얼마나 자주 발생하는지)을 알고 싶습니까? – MonkeyMonkey

+0

@MonkeyMonkey 방금 존재하는지 확인하고 싶습니다. 아무리 많은 장소에서 몇 번이나. – Googlebot

답변

2

your additional comment에 관해서는 explode() 또는 preg_split()을 사용하여 문자열을 단일 단어로 분해 한 다음 array_intersect()을 사용하여 바늘 배열에 대해이 배열을 검사 할 수 있습니다. 따라서 모든 작업은 한 번만 수행됩니다.

<?php 
$haystack = "Hello Houston, we have a problem"; 
$haystacks = preg_split("/\b/", $haystack); 
$needles = array("Chicago", "New York", "Houston"); 
$intersect = array_intersect($haystacks, $needles); 
$count = count($intersect); 

var_dump($count, $intersect); 

나는 array_intersect()가 꽤 빠릅니다. 하지만 실제로 원하는 단어 (일치하는 단어, 일치하는 조각, ..)에 따라 달라집니다.

1

내 개인 기능 :

function wordsFound($haystack,$needles) { 
    return preg_match('/\b('.implode('|',$needles).')\b/i',$haystack);  
} 

//> Usage: 
if (wordsFound('string string string',array('words'))) 

공지 사항 당신이 UTF-8 레그 단어 경계

Notice2의 TEH corrispondent와 \ B를 변경할 필요가 UTF-8 이국적인 문자열 작업하는 경우 :에 확인 그렇지 않으면 당신은

Notice3 전에 preg_quote 할 필요가 $ 바늘에 (MonkeyMonkey 덕분에) 만-Z0-9 문자를 입력 :이 기능은 i 수정 덕분에 insensitve 경우는

+0

내 관심사가 성능에 관한 것이므로; 'preg_match'는'foreach' 루프보다 빠릅니까? – Googlebot

+0

@Ali :이 경우 예. 그것은 $ needle 크기에 따라 달라질 수 있습니다. – dynamic

+1

그 전에 preg_quote()를 사용해야합니다. 그렇지 않으면 정규식 주입의 가능성이 있습니다. – MonkeyMonkey

0

일반적으로 정규식은 str_ipos()과 같은 기본 문자열 함수에 비해 느립니다. 그러나 나는 그것이 상황에 정말로 달려 있다고 생각한다. 최대 성능이 정말로 필요한 경우 실제 데이터로 몇 가지 테스트를 수행하는 것이 좋습니다.

+0

'stripos'는 매우 빠릅니다. 'stripos'의 문제가 아닙니다; 문제는'foreach' 루프를 통해'stripos' 많은 시간을 수행해야한다는 것입니다. – Googlebot

+0

@Ali : 고마워, 알아. 내가 말했듯이 실제 데이터를 사용하여 두 방법을 비교해야합니다. – CodeZombie

관련 문제