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
multibyte
pesadelo é 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.
substr
e strpos
nã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_replace
substituirá 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 $count
parâ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 .