현재 위치: > 최신 기사 목록> Preg_grep을 사용하여 정기적 인 매칭의 성능과 효율성을 향상시킬 때의 팁은 무엇입니까?

Preg_grep을 사용하여 정기적 인 매칭의 성능과 효율성을 향상시킬 때의 팁은 무엇입니까?

gitbox 2025-06-23

1. 정규 표현식을 단순화하십시오

정규 표현의 복잡성은 일치 프로세스의 효율에 직접적인 영향을 미칩니다. 보다 복잡한 정규 표현식은 특히 데이터 볼륨이 클 경우 일치 프로세스 속도를 늦출 수 있습니다. preg_grep 의 성능을 향상시키기 위해 다음 점은 정규식을 단순화하기 위해 고려할 수 있습니다.

  • 너무 많은 역 추적 작업을 피하십시오 : 역 추적 작업은 특히 탐욕스러운 패턴을 사용할 때 일반 경기의 복잡성을 증가시킵니다 (예 : * ). 가능하다면 비 게리 패턴 (예 :*? ) 또는 기타 간단한 매칭 패턴을 사용하십시오.

  • 문자 세트 대신 문자 클래스를 사용하십시오 . 예를 들어, \ d를 사용하여 [0-9] 대신 숫자를 나타냅니다. 이는 일치 계산량을 줄일 수 있습니다.

  • 여러 캡처 패킷을 피하십시오 : 캡처 패킷 캡처는 추가 컴퓨팅 및 메모리 오버 헤드가 추가됩니다. 특히 캡처를 사용할 필요가없는 경우, 비과제 패킷 ( (? : ...) )가 더 효율적입니다.

2. 퍼지 경기보다는 정확히 일치합니다

때로는 퍼지가 아닌 데이터와 정확히 일치해야 할 수도 있습니다. .* 와 같은 너무 광범위한 정규 표현식을 사용하지 말고 특정 패턴을 사용하십시오. 정규 엔진이 기준이 충족되는지 여부를 미리 결정할 수 있기 때문에 정확히 일치하는 것은 일치 속도를 크게 향상시킵니다.

예를 들어, "ABC"로 시작하는 문자열을 찾아야하는 경우 ^ABC와 같은 퍼지 매치를 사용하지 않고 직접 ABC를 사용할 수 있습니다 .*ABC .

3. preg_offset_capture 플래그를 사용하십시오

preg_grep 자체는 preg_offset_capture 플래그를 지원하지 않지만 성능을 더욱 향상시키려는 경우, 특히 경기의 위치를 ​​알아야 할 때 Preg_match 또는 Preg_match_all을 다른 방식으로 결합하여 수행 할 수 있습니다. 일치하는 위치 만 캡처하고 일치하는 컨텐츠의 처리를 줄임으로써 많은 시간을 절약 할 수 있습니다.

4. 데이터 양을 제한합니다

다량의 데이터를 처리 할 때 전체 배열에서 정기적 인 일치 작업을 수행 할 필요가 없습니다. 먼저 배열에서 일부 필터링 또는 세분화 처리를 수행 한 다음 일반 매칭을 수행하는 것을 고려할 수 있습니다. 예를 들어, 먼저 Array_Filter를 사용하여 배열을 사전 필터링하고 기본 조건을 충족하는 요소 만 유지 한 다음 정기적 인 일치를 수행하여 일치 수를 크게 줄일 수 있습니다.

 <span><span><span class="hljs-variable">$array</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_filter</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, function(</span><span><span class="hljs-variable">$value</span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$value</span></span><span>) &gt; </span><span><span class="hljs-number">3</span></span><span>; </span><span><span class="hljs-comment">// 예를 들어:길이가 더 큰 것을 처리합니다3강요</span></span><span>
});
</span><span><span class="hljs-variable">$matches</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_grep</span></span><span>(</span><span><span class="hljs-string">'/pattern/'</span></span><span>, </span><span><span class="hljs-variable">$array</span></span><span>);
</span></span>

5. 올바른 일반 엔진을 선택하십시오

PHP에서 사용하는 일반 엔진 (PCRE)은 이미 매우 강력하지만 성능이 매우 높으면 다른 언어로 일반 엔진을 사용하거나 현지에서 일부 최적화를 수행하는 것을 고려할 수도 있습니다. 예를 들어, 데이터 처리를 위해 Python의 Re 라이브러리 또는 기타보다 효율적인 일반 라이브러리를 사용한 다음 결과를 PHP로 다시 전달하여 처리 할 수 ​​있습니다.

6. Preg_grep 에 대한 빈번한 전화를 피하십시오

동일한 데이터 세트와 여러 정기 일치를 해야하는 경우 데이터 캐시를 고려하십시오. 이렇게하면 매번 정규 경기를 다시 실행할 필요가 없어 불필요한 계산이 줄어 듭니다. 경우에 따라 Array_Map 또는 Array_Walk 와 같은 함수를 사용하여 데이터를 전처리하면 효율성을 향상시킬 수 있습니다.

7. preg_grep 대신 preg_match를 사용하십시오 (가능하면).

preg_grep는 일부 목적으로 매우 유용하지만 경우에 따라 preg_match 또는 preg_match_all을 사용하는 것이 더 효율적 일 수 있습니다. 특히 전체 배열 대신 하나의 요소 만 일치 해야하는 경우 preg_match를 사용하면 불필요한 배열 작업이 직접적으로 줄어 듭니다.

예를 들어:

 <span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$array</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$value</span></span><span>) {
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">preg_match</span></span><span>(</span><span><span class="hljs-string">'/pattern/'</span></span><span>, </span><span><span class="hljs-variable">$value</span></span><span>)) {
        </span><span><span class="hljs-comment">// 处理匹配到강요</span></span><span>
    }
}
</span></span>

8. 정규 표현 최적화를위한 테스트 사례

정기적으로 일치하는 경우 먼저 테스트 케이스를 최적화하는 것이 가장 좋습니다. 불필요한 일치를 줄임으로써 효율성을 향상시킬 수 있습니다. 예를 들어, 특정 특정 형식 (예 : 날짜, 이메일 등)으로 데이터를 일치시키는 경우 먼저 Strpos 또는 Substr 과 같은 간단한 문자열 기능을 통해 조건을 충족 할 수있는 요소를 필터링 한 다음 정기적 인 일치를 수행 할 수 있습니다.