Risposte:
Forma semplice, senza regex:
$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
if (substr($str, 0, strlen($prefix)) == $prefix) {
$str = substr($str, strlen($prefix));
}
Richiede : 0,0369 ms (0,000,036,954 secondi)
E con:
$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
$str = preg_replace('/^' . preg_quote($prefix, '/') . '/', '', $str);
Richiede : 0,1749 ms (0,000,174,999 secondi) la prima corsa (compilazione) e 0,0510 ms (0,000,051,021 secondi) dopo.
Profilato sul mio server, ovviamente.
if(condition) { statement }
sarebbe stato molto più chiaro.
if (substr($str, 0, strlen($prefix)) == $prefix)
può essere modificato per if (0 === strpos($str, $prefix))
evitare allocazioni di memoria inutili mantenendo la stessa leggibilità :)
Puoi usare espressioni regolari con il simbolo del punto di inserimento ( ^
) che fissa la corrispondenza all'inizio della stringa:
$str = preg_replace('/^bla_/', '', $str);
substr()
versione ... Immagino che lo faccia e dovrebbe essere contrassegnato come risposta corretta.
preg_quote
'd
multibyte
L'incubo è un altro problema con altre soluzioni mentre funziona bene se la codifica del file è corretta. Comunque, non dovrebbe essere nell'ambito di questa domanda, quindi non mi importerebbe.
substr
e strpos
non può accettare un array. Ecco fatto, un netto miglioramento delle prestazioni se si ha a che fare con un array. Saluti!
function remove_prefix($text, $prefix) {
if(0 === strpos($text, $prefix))
$text = substr($text, strlen($prefix)).'';
return $text;
}
.''
è necessario.
(substr($str, 0, strlen($prefix)) == $prefix)
dalla risposta accettata fu più simile a .37
Qui.
$array = explode("_", $string);
if($array[0] == "bla") array_shift($array);
$string = implode("_", $array);
_
. Esiste una versione generale?
Penso che substr_replace faccia quello che vuoi, dove puoi limitare la sostituzione a parte della tua stringa: http://nl3.php.net/manual/en/function.substr-replace.php (Questo ti permetterà di guardare solo l'inizio della stringa.)
Puoi usare il parametro count di str_replace ( http://nl3.php.net/manual/en/function.str-replace.php ), questo ti permetterà di limitare il numero di sostituzioni, partendo da sinistra, ma non imporrà che sia all'inizio.
substr_replace
sostituirà i caratteri nell'intervallo indicato indipendentemente dal fatto che siano il prefisso che si desidera rimuovere o qualcos'altro. L'OP vuole rimuovere bla_
"solo se si trova all'inizio della stringa".
Buona velocità, ma questo è hard-coded per dipendere dall'ago che termina con _. Esiste una versione generale? - toddmo il 29 giugno alle 23:26
Una versione generale:
$parts = explode($start, $full, 2);
if ($parts[0] === '') {
$end = $parts[1];
} else {
$fail = true;
}
Alcuni parametri di riferimento:
<?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);
Sul mio abbastanza vecchio PC di casa:
$ php bench.php
Uscite:
strpos+strlen : 0.158388 s
explode : 0.126772 s
Ecco un approccio ancora più veloce:
// strpos is faster than an unnecessary substr() and is built just for that
if (strpos($str, $prefix) === 0) $str = substr($str, strlen($prefix));
Questo rimuoverà la prima corrispondenza ovunque sia trovata, ovvero inizio, metà o fine.
$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 ] )
ora fa quello che vuoi.
$str = "bla_string_bla_bla_bla";
str_replace("bla_","",$str,1);
str_replace()
il $count
parametro della funzione sia una variabile passata per riferimento per contenere il numero di sostituzioni trovate, non limitare il numero di sostituzioni.
Rimuovi www. dall'inizio della stringa, questo è il modo più semplice (ltrim)
$a="www.google.com";
echo ltrim($a, "www.");
ltrim($a, "w.");
farebbe il lavoro solo se il dominio non iniziasse con una "w". ltrim ('m.google.com', ".omg")
risultati in le.com
.
ltrim
esso, viene utilizzato in modo errato. il secondo parametro è un elenco di caratteri che devono essere tagliati; quindi un singolo "w."
sarebbe sufficiente.
s($str)->replacePrefix('_bla')
utile, come si trova in questa libreria autonoma .