Düzenli ifadeyi derlemek biraz zaman alır ama ben o kadar kolay PCRE'yi kullanarak görevden olmaz. Sen de zaman alır iğneler için bir döngü gerekir ve döngüye + her bir iğne için karşılaştırma işlevini çağırarak birkaç iğne alır karşılaştırma fonksiyonu bulmak sürece.
En php.net tüm işlev isimlerini getirir ve bazı sonlar arar bir test komut dosyası atalım. Bu yalnızca bir anlık senaryo oldu ama Strcmp-imsi fonksiyonu + loop Eğer (bu durumda) basit pcre desen daha yavaş olacak kullanmak olursa olsun varsayalım.
count($hs)=5549
pcre: 4.377925157547 s
substr_compare: 7.951938867569 s
identical results: bool(true)
Bu sonuç iken dokuz farklı desen arayın. Sadece iki ('vesaire', 'ge') olsaydı her iki yöntem aynı zaman aldı.
(Herkes için açıktır ama kendini sentetik testlerde hataları her zaman orada değilsin? ;-)) Test script eleştirmek için çekinmeyin
<?php
/* get the test data
All the function names from php.net
*/
$doc = new DOMDocument;
$doc->loadhtmlfile('http://docs.php.net/quickref.php');
$xpath = new DOMXPath($doc);
$hs = array();
foreach( $xpath->query('//a') as $a ) {
$hs[] = $a->textContent;
}
echo 'count($hs)=', count($hs), "\n";
// should find:
// ge, e.g. imagick_adaptiveblurimage
// ing, e.g. m_setblocking
// name, e.g. basename
// ions, e.g. assert_options
$ns = array('yadda', 'ge', 'foo', 'ing', 'bar', 'name', 'abcd', 'ions', 'baz');
sleep(1);
/* test 1: pcre */
$start = microtime(true);
for($run=0; $run<100; $run++) {
$matchesA = array();
$pattern = '/(?:' . join('|', $ns) . ')$/';
foreach($hs as $haystack) {
if ( preg_match($pattern, $haystack, $m) ) {
@$matchesA[$m[0]]+= 1;
}
}
}
echo "pcre: ", microtime(true)-$start, " s\n";
flush();
sleep(1);
/* test 2: loop + substr_compare */
$start = microtime(true);
for($run=0; $run<100; $run++) {
$matchesB = array();
foreach( $hs as $haystack ) {
$hlen = strlen($haystack);
foreach( $ns as $needle ) {
$nlen = strlen($needle);
if ( $hlen >= $nlen && 0===substr_compare($haystack, $needle, -$nlen) ) {
@$matchesB[$needle]+= 1;
}
}
}
}
echo "substr_compare: ", microtime(true)-$start, " s\n";
echo 'identical results: '; var_dump($matchesA===$matchesB);