Bir PHP dizge başka bir dize ile biter olsun en etkin test nedir?

8 Cevap php

Bir dize $str bir alt dize ile biter olup olmadığını test etmek için standart PHP yolu $test olduğunu:

$endsWith = substr( $str, -strlen( $test ) ) == $test

Bu hızlı yoludur?

8 Cevap

Ne Assaf dedi doğrudur. Tam olarak bunu yapmak için PHP, yerleşik bir işlevi vardır.

substr_compare($str, $test, -strlen($test), strlen($test)) === 0;

PHP 5.1 veya daha yüksek kullanarak değilseniz size negatif bir ofset kullanamazsınız çünkü farklı ofset biraz hesaplamak gerekir.

substr_compare($str, $test, strlen($str)-strlen($test), strlen($test)) === 0;

$ Test uzun $ daha str PHP bir uyarı verecek, böylece ilk olduğunu kontrol etmek gerekir.

function endswith($string, $test) {
    $strlen = strlen($string);
    $testlen = strlen($test);
    if ($testlen > $strlen) return false;
    return substr_compare($string, $test, -$testlen) === 0;
}

Bu yöntem hafıza-pahalı, ama daha hızlı bir nebze daha:

stripos(strrev($haystack), $reversed_needle) === 0;

Eğer iğne tam olarak ne olduğunu bu iyi, o yüzden sabit kod ters olabilir. Eğer programlama iğne ters ise, önceki yönteme göre daha yavaş olur.

Burada vererek, tek bir dize başka biter olup olmadığını kontrol etmek için basit bir yol strpos bir dize bulunması gereken sağ nerede ofset:

function stringEndsWith($whole, $end)
{
    return (strpos($whole, $end, strlen($whole) - strlen($end)) !== false);
}

Kolay, ve ben bu PHP 4 çalışacağız düşünüyorum.

Bu umurumda verimlilik hangi tür bağlıdır.

Sizin versiyon nedeniyle substr kullanımı ekstra kopya için daha fazla bellek kullanır.

Alternatif bir versiyonu bir kopyasını yapmadan alt dizenin son oluşumu için özgün dize arama olabilir, ama muhtemelen daha test yüzünden daha yavaş olacaktır.

Muhtemelen en verimli şekilde dizenin sonuna kadar döngü karakter-by-karakter-Sterlen itibaren (test) pozisyonunu yapmak ve karşılaştırmaktır. Yapmanız için umut olabilir karşılaştırmalar az miktarda bulunuyor ve kullanılan neredeyse herhangi bir ekstra bellek var.

Ben hala bazı iyi ol 'tercih /string$/!

Ben aşağıda cevap verimli ve aynı zamanda basit olabilir umuyoruz:

$content = "The main string to search";
$search = "search";
//For compare the begining string with case insensitive. 
if(stripos($content, $search) === 0) echo 'Yes';
else echo 'No';

//For compare the begining string with case sensitive. 
if(strpos($content, $search) === 0) echo 'Yes';
else echo 'No';

//For compare the ending string with case insensitive. 
if(stripos(strrev($content), strrev($search)) === 0) echo 'Yes';
else echo 'No';

//For compare the ending string with case sensitive. 
if(strpos(strrev($content), strrev($search)) === 0) echo 'Yes';
else echo 'No';

I () Eğer dize hızlı sonunu maç yardımcı olacağını strrchr gibi ters fonksiyonları düşünüyorum.