Respostas:
Forma simples, sem regex:
$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
if (substr($str, 0, strlen($prefix)) == $prefix) {
$str = substr($str, strlen($prefix));
}
Leva: 0,0369 ms (0,000,036,954 segundos)
E com:
$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
$str = preg_replace('/^' . preg_quote($prefix, '/') . '/', '', $str);
Leva: 0,1749 ms (0,000,174,999 segundos) na 1ª execução (compilando) e 0,0510 ms (0,000,051,021 segundos) depois.
Perfilado no meu servidor, obviamente.
if(condition) { statement }teria sido muito mais claro.
if (substr($str, 0, strlen($prefix)) == $prefix) pode ser alterado para if (0 === strpos($str, $prefix))evitar a alocação de memória desnecessária, mantendo a mesma legibilidade :)
Você pode usar expressões regulares com o símbolo de sinal de intercalação ( ^) que ancora a correspondência no início da sequência:
$str = preg_replace('/^bla_/', '', $str);
substr()versão ... Acho que funciona, e deve ser marcado como resposta adequada.
preg_quote'd
multibytepesadelo é outro problema com outras soluções, enquanto isso funciona bem se a codificação do arquivo estiver correta. De qualquer forma, não deveria estar no escopo desta pergunta, para que eu não me importasse.
substre strposnão pode aceitar uma matriz. Lá está, um ganho de desempenho definitivo se você estiver lidando com uma matriz. Felicidades!
function remove_prefix($text, $prefix) {
if(0 === strpos($text, $prefix))
$text = substr($text, strlen($prefix)).'';
return $text;
}
.''não é necessário.
(substr($str, 0, strlen($prefix)) == $prefix)a partir da resposta aceita foi mais como 0,37
Aqui.
$array = explode("_", $string);
if($array[0] == "bla") array_shift($array);
$string = implode("_", $array);
_. Existe uma versão geral?
Eu acho que substr_replace faz o que você quer, onde você pode limitar sua substituição a parte da sua string: http://nl3.php.net/manual/en/function.substr-replace.php (Isso permitirá que você veja apenas o início da string.)
Você pode usar o parâmetro count de str_replace ( http://nl3.php.net/manual/en/function.str-replace.php ), isso permitirá que você limite o número de substituições, começando pela esquerda, mas não fará com que seja no início.
substr_replacesubstituirá os caracteres no intervalo especificado, independentemente de serem o prefixo que você deseja remover ou outra coisa. O OP quer remover bla_"apenas se for encontrado no início da string".
Velocidade agradável, mas isso é codificado para depender da agulha que termina com _. Existe uma versão geral? - toddmo 29/06 às 23:26
Uma versão geral:
$parts = explode($start, $full, 2);
if ($parts[0] === '') {
$end = $parts[1];
} else {
$fail = true;
}
Alguns benchmarks:
<?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);
No meu PC doméstico bastante antigo:
$ php bench.php
Saídas:
strpos+strlen : 0.158388 s
explode : 0.126772 s
Aqui está uma abordagem ainda mais rápida:
// strpos is faster than an unnecessary substr() and is built just for that
if (strpos($str, $prefix) === 0) $str = substr($str, strlen($prefix));
Isso removerá a primeira correspondência onde quer que seja encontrada, isto é, início ou meio ou fim.
$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 ] )
agora faz o que você quer.
$str = "bla_string_bla_bla_bla";
str_replace("bla_","",$str,1);
str_replace()da função $countparâmetro deverá ser uma variável passada por referência para conter o número de substituições encontrado, não limitar o número de substituições.
Retire www. desde o início da string, esta é a maneira mais fácil (ltrim)
$a="www.google.com";
echo ltrim($a, "www.");
ltrim($a, "w.");faria o trabalho apenas se o domínio não iniciar com um "w". ltrim ('m.google.com', ".omg")resulta em le.com.
ltrim, ele será usado incorretamente. o segundo parâmetro é uma lista de caracteres que devem ser aparados; portanto, um único "w."seria suficiente.
s($str)->replacePrefix('_bla')útil, conforme encontrado nesta biblioteca autônoma .