Alguém conhece uma maneira muito rápida de substituir a última ocorrência de uma string por outra em uma string?
Alguém conhece uma maneira muito rápida de substituir a última ocorrência de uma string por outra em uma string?
Respostas:
Você pode usar esta função:
function str_lreplace($search, $replace, $subject)
{
$pos = strrpos($subject, $search);
if($pos !== false)
{
$subject = substr_replace($subject, $replace, $pos, strlen($search));
}
return $subject;
}
TRUE
não importa o quê. Retorna uma string, não importa o quê. Se a substituição não pode ser feita devolve o original $subject
, assim como substr_replace
e str_replace
fazer.
strpos — Find the position of the first occurrence of a substring in a string
- editar: uau. Gênios php realmente fizeram uma função chamada strpos
e strrpos
? Obrigado ....
Outro liner, mas sem preg:
$subject = 'bourbon, scotch, beer';
$search = ',';
$replace = ', and';
echo strrev(implode(strrev($replace), explode(strrev($search), strrev($subject), 2))); //output: bourbon, scotch, and beer
$string = 'this is my world, not my world';
$find = 'world';
$replace = 'farm';
$result = preg_replace(strrev("/$find/"),strrev($replace),strrev($string),1);
echo strrev($result); //output: this is my world, not my farm
A solução compacta a seguir usa a asserção lookahead positiva do PCRE para corresponder à última ocorrência da substring de interesse, ou seja, uma ocorrência da substring que não é seguida por nenhuma outra ocorrência da mesma substring. Assim, o exemplo substitui o last 'fox'
por 'dog'
.
$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!';
echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
RESULTADO:
The quick brown fox, fox, fox jumps over the lazy dog!!!
$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!'; echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
Você pode fazer isso:
$str = 'Hello world';
$str = rtrim($str, 'world') . 'John';
O resultado é 'Olá João';
Saudações
rtrim
não se comporta da maneira que você está pensando. Ele removerá do final todos os caracteres existentes na cadeia de pesquisa em qualquer ordem (e sempre acrescentará a substituição), por exemplo, "Hello word" -> "Hello John", "Hello John", "Hello lord" -> "Hello John", "Hello motor "->" Olá motJohn "," Olá mundano "->" Olá mundanoJohn ".
Isso também funcionará:
function str_lreplace($search, $replace, $subject)
{
return preg_replace('~(.*)' . preg_quote($search, '~') . '(.*?)~', '$1' . $replace . '$2', $subject, 1);
}
ATUALIZAÇÃO Versão um pouco mais concisa ( http://ideone.com/B8i4o ):
function str_lreplace($search, $replace, $subject)
{
return preg_replace('~(.*)' . preg_quote($search, '~') . '~', '$1' . $replace, $subject, 1);
}
Essa é uma pergunta antiga, mas por que todos estão ignorando a solução mais simples baseada em regexp? Os quantificadores normais de regexp são gananciosos, pessoal! Se você deseja encontrar a última instância de um padrão, fique .*
na frente dele. Aqui está como:
$text = "The quick brown fox, fox, fox, fox, jumps over etc.";
$fixed = preg_replace("((.*)fox)", "$1DUCK", $text);
print($fixed);
Isso substituirá a última instância de "fox" para "DUCK", como deveria, e imprimirá:
The quick brown fox, fox, fox, DUCK, jumps over etc.
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
if($findChar !== FALSE) {
$string[$findChar]=".";
}
echo $string;
Além dos erros no código, Faruk Unal tem a melhor resposta. Uma função faz o truque.
Você pode usar strrpos () para encontrar a última correspondência.
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
$string[$findChar]=".";
echo $string;
Saída: picture_0007.value
Uma versão curta:
$NewString = substr_replace($String,$Replacement,strrpos($String,$Replace),strlen($Replace));
Use o "$" em uma expressão reg para corresponder ao final da string
$string = 'The quick brown fox jumps over the lazy fox';
echo preg_replace('/fox$/', 'dog', $string);
//output
'The quick brown fox jumps over the lazy dog'
Para os interessados: eu escrevi uma função que utiliza preg_match para que você possa substituir do lado direito usando regex.
function preg_rreplace($search, $replace, $subject) {
preg_match_all($search, $subject, $matches, PREG_SET_ORDER);
$lastMatch = end($matches);
if ($lastMatch && false !== $pos = strrpos($subject, $lastMatchedStr = $lastMatch[0])) {
$subject = substr_replace($subject, $replace, $pos, strlen($lastMatchedStr));
}
return $subject;
}
Ou como uma combinação / implementação abreviada de ambas as opções:
function str_rreplace($search, $replace, $subject) {
return (false !== $pos = strrpos($subject, $search)) ?
substr_replace($subject, $replace, $pos, strlen($search)) : $subject;
}
function preg_rreplace($search, $replace, $subject) {
preg_match_all($search, $subject, $matches, PREG_SET_ORDER);
return ($lastMatch = end($matches)) ? str_rreplace($lastMatch[0], $replace, $subject) : $subject;
}
com base em https://stackoverflow.com/a/3835653/3017716 e https://stackoverflow.com/a/23343396/3017716
s($str)->replaceLast($search, $replace)
útil, conforme encontrado nesta biblioteca autônoma .