배열에 단어 목록이 있습니다. 문자열에 이러한 단어가 있는지 확인하는 가장 빠른 방법은 무엇입니까?배열 요소가 문자열에 있는지 확인하는 방법
현재 foreach
루프를 통해 하나씩 배열 요소의 존재를 확인하고 있습니다 (stripos
). 더 빠른 방법이 있다면 궁금합니다. 배열을 사용하여 str_replace
을 처리하는 것과 같습니다.
배열에 단어 목록이 있습니다. 문자열에 이러한 단어가 있는지 확인하는 가장 빠른 방법은 무엇입니까?배열 요소가 문자열에 있는지 확인하는 방법
현재 foreach
루프를 통해 하나씩 배열 요소의 존재를 확인하고 있습니다 (stripos
). 더 빠른 방법이 있다면 궁금합니다. 배열을 사용하여 str_replace
을 처리하는 것과 같습니다.
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()가 꽤 빠릅니다. 하지만 실제로 원하는 단어 (일치하는 단어, 일치하는 조각, ..)에 따라 달라집니다.
내 개인 기능 :
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 경우는
내 관심사가 성능에 관한 것이므로; 'preg_match'는'foreach' 루프보다 빠릅니까? – Googlebot
@Ali :이 경우 예. 그것은 $ needle 크기에 따라 달라질 수 있습니다. – dynamic
그 전에 preg_quote()를 사용해야합니다. 그렇지 않으면 정규식 주입의 가능성이 있습니다. – MonkeyMonkey
일반적으로 정규식은 str_ipos()
과 같은 기본 문자열 함수에 비해 느립니다. 그러나 나는 그것이 상황에 정말로 달려 있다고 생각한다. 최대 성능이 정말로 필요한 경우 실제 데이터로 몇 가지 테스트를 수행하는 것이 좋습니다.
'stripos'는 매우 빠릅니다. 'stripos'의 문제가 아닙니다; 문제는'foreach' 루프를 통해'stripos' 많은 시간을 수행해야한다는 것입니다. – Googlebot
@Ali : 고마워, 알아. 내가 말했듯이 실제 데이터를 사용하여 두 방법을 비교해야합니다. – CodeZombie
일치하는 항목이 있는지 알고 싶습니까? 아니면 일치하는 항목 (또는 얼마나 자주 발생하는지)을 알고 싶습니까? – MonkeyMonkey
@MonkeyMonkey 방금 존재하는지 확인하고 싶습니다. 아무리 많은 장소에서 몇 번이나. – Googlebot