2008-10-16 137 views
56

有沒有在PHP中編譯正則表達式的方法,以便它可以在不重複編譯過程的情況下與多個字符串進行比較?其他主要語言可以做到這一點 - Java,C#,Python,Javascript等。在PHP中編譯正則表達式

回答

4

我並不積極,你可以。如果您查看Mastering Regular Expressions,則在Chapter10:PHP中將討論一些PHP特定的優化技術。具體來說,使用S模式修飾符可以使正則表達式引擎在應用正則表達式之前「研究」正則表達式。根據您的圖案和文字,這可能會提高速度。

編輯:您可以使用books.google.com來查看本書的內容。

+0

每個使用正則表達式的開發者都應該閱讀本書! 你需要的所有技術都是有效的。 – Arno 2009-12-08 14:35:59

17

preg正則表達式可以使用大寫S(學習)修飾符,這可能是您正在尋找的東西。

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

小號

當一個圖案將被使用幾次,這是值得花 更多的時間,以便對其進行分析,以 加快採取匹配的時間。 如果設置了此修飾符,則會執行此額外分析。在 目前,研究一個模式是有用的 只適用於非錨定模式,其中 沒有一個固定的起始 字符。

+9

OP的問題的答案是,不需要在PHP中預編譯正則表達式,因爲正如1stvamp所述,編譯後的正則表達式會自動緩存。 'S'修飾符是一個單獨的問題。 – 2009-04-07 03:39:13

+0

此答案已添加到[Stack Overflow Regular Expression FAQ](http://stackoverflow.com/a/22944075/2736496),在「修改器」下。 – aliteralmind 2014-04-10 00:41:23

39

的Perl兼容正則表達式庫可能已經被您的使用情況下不提供像其他語言的正則表達式類的優化做的事:

這個擴展維持全球每線程緩存的編制規則表達式(最多4096)。

PCRE Introduction

這是Imran描述的研究改性劑如何可以存儲呼叫之間編譯的表達。

+0

我可以增加每線程緩存的大小和4096的含義是什麼 – 2013-09-11 05:07:20

7

正如另一位評論者已經說過的,PCRE正則表達式已經編譯完成,而且您不必專門引用它們,PCRE會保留由您提供的原始字符串索引的內部哈希。

12

線程是腳本當前正在運行的線程。第一次使用後,編譯後的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倍!