Odpowiedzi:
Forma zwykła, bez wyrażenia regularnego:
$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
if (substr($str, 0, strlen($prefix)) == $prefix) {
$str = substr($str, strlen($prefix));
}
Trwa: 0,0369 ms (0,000 036,954 sekund)
I z:
$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
$str = preg_replace('/^' . preg_quote($prefix, '/') . '/', '', $str);
Trwa: 0,1749 ms (0,000174,999 sekund) pierwsze uruchomienie (kompilacja) i 0,0510 ms (0,000 051 021 sekund) później.
Oczywiście profilowane na moim serwerze.
if(condition) { statement }
byłby o wiele jaśniejszy.
if (substr($str, 0, strlen($prefix)) == $prefix)
można zmienić na, if (0 === strpos($str, $prefix))
aby uniknąć niepotrzebnego przydziału pamięci przy zachowaniu tej samej czytelności :)
Możesz użyć wyrażeń regularnych z symbolem daszka ( ^
), który zakotwicza dopasowanie na początku ciągu:
$str = preg_replace('/^bla_/', '', $str);
substr()
wersja ... Myślę, że tak i należy to zaznaczyć jako właściwą odpowiedź.
preg_quote
„d
multibyte
koszmar to kolejny problem z innymi rozwiązaniami, ale działa to dobrze, jeśli kodowanie pliku jest poprawne. Zresztą to nie powinno wchodzić w zakres tego pytania, więc nie obchodzi mnie to.
substr
i strpos
nie może zaakceptować tablicy. Proszę bardzo, wyraźny wzrost wydajności, jeśli masz do czynienia z tablicą. Twoje zdrowie!
function remove_prefix($text, $prefix) {
if(0 === strpos($text, $prefix))
$text = substr($text, strlen($prefix)).'';
return $text;
}
.''
jest potrzebne.
(substr($str, 0, strlen($prefix)) == $prefix)
z zaakceptowanej odpowiedzi było bardziej jak
Tutaj.
$array = explode("_", $string);
if($array[0] == "bla") array_shift($array);
$string = implode("_", $array);
_
. Czy istnieje wersja ogólna?
Myślę, że substr_replace robi to, co chcesz, gdzie możesz ograniczyć zamianę do części twojego ciągu: http://nl3.php.net/manual/en/function.substr-replace.php (To pozwoli ci spojrzeć tylko na początek ciągu.)
Możesz użyć parametru count w str_replace ( http://nl3.php.net/manual/en/function.str-replace.php ), pozwoli to ograniczyć liczbę wymian, zaczynając od lewej, ale nie wymusi tego na początku.
substr_replace
zamieni znaki w podanym zakresie niezależnie od tego, czy są to przedrostki, które chcesz usunąć, czy coś innego. Operator chce usunąć bla_
„tylko wtedy, gdy zostanie znaleziony na początku ciągu”.
Niezła prędkość, ale jest to zakodowane na stałe w zależności od igły kończącej się na _. Czy istnieje wersja ogólna? - toddmo 29 czerwca o 23:26
Wersja ogólna:
$parts = explode($start, $full, 2);
if ($parts[0] === '') {
$end = $parts[1];
} else {
$fail = true;
}
Niektóre testy porównawcze:
<?php
$iters = 100000;
$start = "/aaaaaaa/bbbbbbbbbb";
$full = "/aaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee";
$end = '';
$fail = false;
$t0 = microtime(true);
for ($i = 0; $i < $iters; $i++) {
if (strpos($full, $start) === 0) {
$end = substr($full, strlen($start));
} else {
$fail = true;
}
}
$t = microtime(true) - $t0;
printf("%16s : %f s\n", "strpos+strlen", $t);
$t0 = microtime(true);
for ($i = 0; $i < $iters; $i++) {
$parts = explode($start, $full, 2);
if ($parts[0] === '') {
$end = $parts[1];
} else {
$fail = true;
}
}
$t = microtime(true) - $t0;
printf("%16s : %f s\n", "explode", $t);
Na moim dość starym komputerze domowym:
$ php bench.php
Wyjścia:
strpos+strlen : 0.158388 s
explode : 0.126772 s
Oto jeszcze szybsze podejście:
// strpos is faster than an unnecessary substr() and is built just for that
if (strpos($str, $prefix) === 0) $str = substr($str, strlen($prefix));
Spowoduje to usunięcie pierwszego dopasowania, gdziekolwiek zostanie znalezione, tj. Początek, środek lub koniec.
$str = substr($str, 0, strpos($str, $prefix)).substr($str, strpos($str, $prefix)+strlen($prefix));
<?php
$str = 'bla_string_bla_bla_bla';
echo preg_replace('/bla_/', '', $str, 1);
?>
str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
teraz robi co chcesz.
$str = "bla_string_bla_bla_bla";
str_replace("bla_","",$str,1);
str_replace()
funkcyjnego $count
Oczekuje się parametr być zmienna przekazywana przez odniesienie do zawierać liczbę wymian znaleźć, nie ogranicza liczby wymian.
Usuń www. od początku napisu, to jest najłatwiejszy sposób (ltrim)
$a="www.google.com";
echo ltrim($a, "www.");
ltrim($a, "w.");
wykonałby zadanie tylko wtedy, gdyby domena nie zaczynała się od litery „w”. ltrim ('m.google.com', ".omg")
powoduje le.com
.
ltrim
, jest używany nieprawidłowo. drugi parametr to lista znaków, które należy przyciąć; dlatego jeden "w."
byłby wystarczający.
s($str)->replacePrefix('_bla')
pomocny, co znajdziesz w tej samodzielnej bibliotece .