Bir dize ile başlıyorsa "_" nasıl kontrol

6 Cevap

Örnek: Ben bir $ değişken = "_foo" var, ve ben $ değişken bir çizgi "_" ile başlamıyor kesinlikle emin olmak istiyorum. PHP bunu nasıl yapabilirim? Dizenin arkasında bir karakter dizisine bazı erişim var mı?

6 Cevap

Siz php substr fonksiyonunu kontrol ve ilk karakteri bu şekilde kapmak olabilir:

http://php.net/manual/en/function.substr.php

if (substr('_abcdef', 0, 1) === '_') { ... }
$variable[0] != "_"

How does it work?

PHP Eğer dizi indeksi gösterimde olan bir dize belirli bir karakter alabilirsiniz. ($ Değişken bir dize ise) $variable[0], bir dizenin ilk karakteridir.

Birisi verimlilik söz beri, şimdiye kadar meraktan verilen işlevleri benchmarked ettik:

function startsWith1($str, $char) {
    return strpos($str, $char) === 0;
}
function startsWith2($str, $char) {
    return stripos($str, $char) === 0;
}
function startsWith3($str, $char) {
    return substr($str, 0, 1) === $char;
}
function startsWith4($str, $char){
    return $str[0] === $char;
}
function startsWith5($str, $char){
    return (bool) preg_match('/^' . $char . '/', $str);
}
function startsWith6($str, $char) {
    if (is_null($encoding)) $encoding = mb_internal_encoding();
    return mb_substr($str, 0, mb_strlen($char, $encoding), $encoding) === $char;
}

Burada 100.000 çalışan biri ile benim ortalama DualCore makinede sonuçları

// Testing '_string'
startsWith1 took 0.385906934738
startsWith2 took 0.457293987274
startsWith3 took 0.412894964218
startsWith4 took 0.366240024567 <-- fastest
startsWith5 took 0.642996072769
startsWith6 took 1.39859509468

// Tested "string"
startsWith1 took 0.384965896606
startsWith2 took 0.445554971695
startsWith3 took 0.42377281189
startsWith4 took 0.373164176941 <-- fastest
startsWith5 took 0.630424022675
startsWith6 took 1.40699005127

// Tested 1000 char random string [a-z0-9]
startsWith1 took 0.430691003799
startsWith2 took 4.447286129
startsWith3 took 0.413349866867
startsWith4 took 0.368592977524 <-- fastest
startsWith5 took 0.627470016479
startsWith6 took 1.40957403183

// Tested 1000 char random string [a-z0-9] with '_' prefix
startsWith1 took 0.384054899216
startsWith2 took 4.41522812843
startsWith3 took 0.408898115158
startsWith4 took 0.363884925842 <-- fastest
startsWith5 took 0.638479948044
startsWith6 took 1.41304707527

Gördüğünüz gibi, ilk pozisyonda karakterini öğrenmek için bir dizi olarak samanlık tedavi always the fastest çözümdür. Ayrıca bağımsız olarak her zaman dize uzunluğu, eşit hızda gerçekleştiriyor. Kullanımı strpos dizesi öneki ile başlayan olmadığında, kısa dizeleri için substr daha hızlı ama uzun dizeleri için yavaştır. Fark olsa alakasız. stripos Uzun dizeleri ile incredibly yavaş. preg_match olursa olsun dize uzunluğu aynı çoğunlukla gerçekleştirir, ancak hız sadece vasat. Muhtemelen rağmen daha güvenilir olurken mb_substr çözüm, kötü gerçekleştirir.

Bu sayılar 100.000 çalışan için olduğu göz önüne alındığında, biz çağrı başına yaklaşık 0.0000x saniye konuştuğunu açık olmalı. App startsWith bir yaşam için kontrol yapıyor sürece için diğer üzerinden bir toplama efficiency, değersiz bir mikro-optimizasyonu.

Burada daha iyi bir starts with fonksiyonu bulunuyor:

function mb_startsWith($str, $prefix, $encoding=null) {
    if (is_null($encoding)) $encoding = mb_internal_encoding();
    return mb_substr($str, 0, mb_strlen($prefix, $encoding), $encoding) === $prefix;
}

Pinusnegra cevabı üzerine, ve bu yanıta Gumbo yorumuna yanıt oluşturmak için:

function has_leading_underscore($string) {

    return $string[0] === '_';

}

PHP 5.3.0 Koşu, çalışmaları takip ve hatta dize uzunluğu en az 1 karakter olup olmadığını kontrol etmeden beklenen değerini döndürür:

echo has_leading_underscore('_somestring').', ';
echo has_leading_underscore('somestring').', ';
echo has_leading_underscore('').', ';
echo has_leading_underscore(null).', ';
echo has_leading_underscore(false).', ';
echo has_leading_underscore(0).', ';
echo has_leading_underscore(array('_foo', 'bar'));

/*
 * output: true, false, false, false, false, false, false
 */

Ben PHP diğer sürümleri nasıl tepki vereceğini bilmiyorum, ama hepsi çalışıyorsanız, o zaman bu yöntem muhtemelen substr rota daha verimlidir.

Bu performansı hakkında endişe değil en basit cevap:

if ((strpos($string, '_') === 0) {
    # code
}

Strpos döner 0 ne aradığınız karakteri 0, dize başında başlar demektir.

İyice burada belgelenmiştir: http://uk3.php.net/manual/en/function.strpos.php