Respuestas:
Forma simple, sin expresión regular:
$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
if (substr($str, 0, strlen($prefix)) == $prefix) {
$str = substr($str, strlen($prefix));
}
Toma: 0.0369 ms (0.000,036,954 segundos)
Y con:
$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
$str = preg_replace('/^' . preg_quote($prefix, '/') . '/', '', $str);
Toma: 0.1749 ms (0.000,174,999 segundos) la primera ejecución (compilación) y 0.0510 ms (0.000,051,021 segundos) después.
Perfilado en mi servidor, obviamente.
if(condition) { statement }
habría sido mucho más claro.
if (substr($str, 0, strlen($prefix)) == $prefix)
puede ser cambiado para if (0 === strpos($str, $prefix))
evitar la asignación de memoria innecesaria mientras se mantiene la misma facilidad de lectura :)
Puede usar expresiones regulares con el símbolo de intercalación ( ^
) que ancla la coincidencia al comienzo de la cadena:
$str = preg_replace('/^bla_/', '', $str);
substr()
versión ... Supongo que sí, y debería marcarse como respuesta adecuada.
preg_quote
'd
multibyte
La pesadilla es otro problema con otras soluciones, mientras que esto funciona bien si la codificación del archivo es correcta. De todos modos, no debería estar en el alcance de esta pregunta, así que no me importaría.
substr
y strpos
no puede aceptar una matriz. Ahí tienes, una ganancia de rendimiento definitiva si estás lidiando con una matriz. ¡Salud!
function remove_prefix($text, $prefix) {
if(0 === strpos($text, $prefix))
$text = substr($text, strlen($prefix)).'';
return $text;
}
.''
no es necesario.
(substr($str, 0, strlen($prefix)) == $prefix)
de la respuesta aceptada fue más como .37
Aquí.
$array = explode("_", $string);
if($array[0] == "bla") array_shift($array);
$string = implode("_", $array);
_
. ¿Hay una versión general?
Creo que substr_replace hace lo que quiere, donde puede limitar su reemplazo a parte de su cadena: http://nl3.php.net/manual/en/function.substr-replace.php (Esto le permitirá mirar solo El comienzo de la cadena.)
Puede usar el parámetro count de str_replace ( http://nl3.php.net/manual/en/function.str-replace.php ), esto le permitirá limitar el número de reemplazos, comenzando desde la izquierda, pero no lo hará cumplir al principio.
substr_replace
reemplazará los caracteres en el rango dado independientemente de si son el prefijo que desea eliminar o algo más. El OP quiere eliminar bla_
"solo si se encuentra al principio de la cadena".
Buena velocidad, pero esto está codificado para depender de que la aguja termine con _. ¿Hay una versión general? - toddmo 29 de junio a las 23:26
Una versión general:
$parts = explode($start, $full, 2);
if ($parts[0] === '') {
$end = $parts[1];
} else {
$fail = true;
}
Algunos puntos de referencia:
<?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);
En mi PC casera bastante vieja:
$ php bench.php
Salidas:
strpos+strlen : 0.158388 s
explode : 0.126772 s
Aquí hay un enfoque aún más rápido:
// strpos is faster than an unnecessary substr() and is built just for that
if (strpos($str, $prefix) === 0) $str = substr($str, strlen($prefix));
Esto eliminará la primera coincidencia donde se encuentre, es decir, inicio, medio o final.
$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 ] )
ahora hace lo que quieres.
$str = "bla_string_bla_bla_bla";
str_replace("bla_","",$str,1);
str_replace()
el $count
parámetro de la función sea una variable pasada por referencia para contener el número de reemplazos encontrados, no limitar el número de reemplazos.
Eliminar www. desde el principio de la cadena, esta es la forma más fácil (ltrim)
$a="www.google.com";
echo ltrim($a, "www.");
ltrim($a, "w.");
lo tanto: haría el trabajo solo si el dominio no comenzara con una "w". ltrim ('m.google.com', ".omg")
resultados en le.com
.
ltrim
, se usa incorrectamente. el segundo parámetro es una lista de caracteres que se deben recortar; por lo tanto, un solo "w."
sería suficiente.
s($str)->replacePrefix('_bla')
útil, como se encuentra en esta biblioteca independiente .