PHP regex derlemek

5 Cevap php

Daha sonra derleme işlemi tekrar olmadan birden dizeleri göre böylece, normal bir ifade derlemek için PHP bir yolu var mı? Diğer önemli dilleri yapabilirsiniz vb - Java, C #, Python, Javascript,

5 Cevap

Başka bir yorumcu zaten dediği gibi, PCRE regexes zaten sizin spesifik gibi onlara başvurmak zorunda kalmadan derlenmiş, PCRE sağlanan orijinal dizesi tarafından endeksli bir iç karma tutar.

Yapabileceğini olumlu değilim. Eğer Mastering Regular Expressions kontrol ederseniz, bazı PHP özel optimizasyon teknikleri Chapter10 tartışılmaktadır: PHP. Onu uygular önce özellikle S model değiştirici kullanımı "Çalışması" düzenli ifade regex motoru neden. Lütfen desen ve metin bağlı olarak, bu size bazı gelişmeler hız verebilir.

Edit: Eğer books.google.com kullanarak kitabın içeriğine bir göz alabilir.

Perl-uyumlu düzenli ifadeler kütüphane diğer diller gibi bir Regex sınıfı yok sağlamadan zaten kullanım durumda optimize edilebilir olabilir:

Bu uzantı (4096 kadar) derlenmiş düzenli ifadeler küresel başına iş parçacığı önbelleği tutar.

PCRE Introduction

Bu Imran açıklanan çalışma değiştirici çağrıları arasında derlenmiş ifade saklayabilirsiniz nasıl.

gebelik regexes muhtemelen aradığınız şey olduğu, büyük S (çalışma) değiştirici kullanabilirsiniz.

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

S

When a pattern is going to be used several times, it is worth spending more time analyzing it in order to speed up the time taken for matching. If this modifier is set, then this extra analysis is performed. At present, studying a pattern is useful only for non-anchored patterns that do not have a single fixed starting character.

Konu komut şu anda ilk kullanımdan sonra içeri çalıştıran parçacığı, derlenmiş regexp önbelleğe alınır ve PHP kullanılan bir dahaki sefere tekrar derleme değil.

Basit bir test:

<?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);

Regexp with caching avg 0.1 Regexp without caching avg 0.8

Regexpi önbelleğe o 8 kat daha hızlı yapar!