programing

PHP에서 정규식 컴파일

nasanasas 2020. 12. 5. 09:52
반응형

PHP에서 정규식 컴파일


PHP에서 정규 표현식을 컴파일하여 컴파일 프로세스를 반복하지 않고 여러 문자열과 비교할 수있는 방법이 있습니까? 다른 주요 언어 (Java, C #, Python, Javascript 등)가이를 수행 할 수 있습니다.


Perl 호환 정규식 라이브러리는 다른 언어처럼 Regex 클래스를 제공하지 않고 이미 사용 사례에 맞게 최적화되었을 수 있습니다.

이 확장은 컴파일 된 정규식의 전역 스레드 당 캐시 (최대 4096 개)를 유지합니다.

PCRE 소개

이것이 Imran이 설명한 study modifier가 호출 사이에 컴파일 된 표현식을 저장할 수 있는 방법 입니다.


preg regexes는 대문자 S (study) 수정자를 사용할 수 있는데, 아마도 여러분이 찾고있는 것일 것입니다.

http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

에스

패턴이 여러 번 사용되는 경우 일치에 걸리는 시간을 단축하기 위해 패턴을 분석하는 데 더 많은 시간을 할애 할 가치가 있습니다. 이 수정자가 설정되면이 추가 분석이 수행됩니다. 현재 패턴 연구는 단일 고정 시작 문자가없는 고정되지 않은 패턴에만 유용합니다.


Thread는 스크립트가 현재 실행되고있는 스레드입니다. 처음 사용 후 컴파일 된 regexp가 캐시되고 다음에 사용될 때 PHP가 다시 컴파일하지 않습니다.

간단한 테스트 :

<?php

function microtime_float() {
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}

// test string
$text='The big brown <b>fox</b> jumped over a lazy <b>cat</b>';
$testTimes=10;


$avg=0;
for ($x=0; $x<$testTimes; $x++)
{
    $start=microtime_float();
    for ($i=0; $i<10000; $i++) {
        preg_match_all('/<b>(.*)<\/b>0?/', $text, $m);
    }
    $end=microtime_float();
    $avg += (float)$end-$start;
}

echo 'Regexp with caching avg '.($avg/$testTimes);

// regexp without caching
$avg=0;
for ($x=0; $x<$testTimes; $x++)
{
    $start=microtime_float();
    for ($i=0; $i<10000; $i++) {
        $pattern='/<b>(.*)<\/b>'.$i.'?/';
        preg_match_all($pattern, $text, $m);
    }
    $end=microtime_float();
    $avg += (float)$end-$start;
}

echo '<br/>Regexp without caching avg '.($avg/$testTimes);

캐싱이있는 정규식 평균 0.1 캐싱이없는 정규식 평균 0.8

정규 표현식을 캐싱하면 8 배 더 빨라집니다!


다른 주석가가 이미 말했듯이, PCRE 정규식은 특별히 참조 할 필요없이 이미 컴파일되었으며, PCRE는 제공 한 원래 문자열로 색인 된 내부 해시를 유지합니다.


I'm not positive that you can. If you check out Mastering Regular Expressions, some PHP specific optimization techniques are discussed in Chapter10: PHP. Specifically the use of the S pattern modifier to cause the regex engine to "Study" the regular expression before it applies it. Depending on your pattern and your text, this could give you some speed improvements.

Edit: you can take a peek at the contents of the book using books.google.com.

참고URL : https://stackoverflow.com/questions/209906/compile-regex-in-php

반응형