Inserir string na posição especificada

270

Existe uma função PHP que pode fazer isso?

Estou usando strpospara obter a posição de uma subcadeia e quero inserir um stringdepois dessa posição.

Alex
fonte

Respostas:

566
$newstr = substr_replace($oldstr, $str_to_insert, $pos, 0);

http://php.net/substr_replace

urmaul
fonte
24
Essa deve ser a resposta aceita. As funções internas têm precedência sobre as funções criadas pelo usuário a qualquer dia.
Benjam
13
Sim, o quarto argumento sendo "0" faz com que a cadeia de reposição seja inserida sem substituir nenhuma da cadeia original.
Buttle Butkus
7
Resposta brilhante. Mas para pessoas preguiçosas (como eu) talvez deva haver uma breve explicação em seu post. Vou fazer agora e copiar e colar do php.net: "Claro que, se o comprimento for zero, esta função terá o efeito de inserir a substituição na string no deslocamento inicial especificado".
precisa saber é o seguinte
7
Cuidado: A função substr_replace () não é multibyte segura! Seu $ pos pode estar no meio de um caractere UTF-8. Pode ser necessário empregar a solução do @ tim-cooper, mas usando mb_substr ().
richplane
72
$str = substr($oldstr, 0, $pos) . $str_to_insert . substr($oldstr, $pos);

substr no manual do PHP

Tim Cooper
fonte
Eu criei uma função str_insert com esta linha, é mais reutilizável.
djleop
12

Experimente, ele funcionará para qualquer número de substrings

<?php
    $string = 'bcadef abcdef';
    $substr = 'a';
    $attachment = '+++';

    //$position = strpos($string, 'a');

    $newstring = str_replace($substr, $substr.$attachment, $string);

    // bca+++def a+++bcdef
?>
alexdets
fonte
7

Use a função stringInsert em vez da função putinplace. Eu estava usando a função posterior para analisar uma consulta mysql. Embora a saída parecesse correta, a consulta resultou em um erro que levou um tempo para ser rastreado. A seguir, minha versão da função stringInsert que requer apenas um parâmetro.

function stringInsert($str,$insertstr,$pos)
{
    $str = substr($str, 0, $pos) . $insertstr . substr($str, $pos);
    return $str;
}  
user2958137
fonte
4
str_replace($sub_str, $insert_str.$sub_str, $org_str);
xdazz
fonte
@minitech O op disse using strpos to get the position of a substring, então o que substringvem primeiro. E ele não disse que encontrasse apenas uma posição.
Xdazz
3

Eu tenho uma minha função antiga para isso:

function putinplace($string=NULL, $put=NULL, $position=false)
{
    $d1=$d2=$i=false;
    $d=array(strlen($string), strlen($put));
    if($position > $d[0]) $position=$d[0];
    for($i=$d[0]; $i >= $position; $i--) $string[$i+$d[1]]=$string[$i];
    for($i=0; $i<$d[1]; $i++) $string[$position+$i]=$put[$i];
    return $string;
}

// Explanation
$string='My dog dont love postman'; // string
$put="'"; // put ' on position
$position=10; // number of characters (position)
print_r( putinplace($string, $put, $position) ); //RESULT: My dog don't love postman

Essa é uma função pequena e poderosa que executa seu trabalho na perfeição.

Ivijan Stefan Stipić
fonte
3

Esta foi minha solução simples, acrescentando também o texto à próxima linha depois que ela encontrou a palavra-chave.

$oldstring = "This is a test\n#FINDME#\nOther text and data.";

function insert ($string, $keyword, $body) {
   return substr_replace($string, PHP_EOL . $body, strpos($string, $keyword) + strlen($keyword), 0);
}

echo insert($oldstring, "#FINDME#", "Insert this awesome string below findme!!!");

Resultado:

This is a test
#FINDME#
Insert this awesome string below findme!!!
Other text and data.
Lance Badger
fonte
3

Só queria acrescentar algo: achei a resposta de tim cooper muito útil, usei-a para criar um método que aceita uma matriz de posições e faz a inserção em todas elas, então aqui está:

EDIT: Parece que minha função antiga assumida$insertstrtinha apenas 1 caractere e que a matriz foi classificada. Isso funciona para caracteres arbitrários.

function stringInsert($str, $pos, $insertstr) {
    if (!is_array($pos)) {
        $pos = array($pos);
    } else {
        asort($pos);
    }
    $insertionLength = strlen($insertstr);
    $offset = 0;
    foreach ($pos as $p) {
        $str = substr($str, 0, $p + $offset) . $insertstr . substr($str, $p + $offset);
        $offset += $insertionLength;
    }
    return $str;
}
chiliNUT
fonte
1
Isso não funciona. Seu deslocamento supõe que $ interstr tenha apenas 1 caractere. Você precisa adicionar deslocamento, dependendo do comprimento da inserção, começar com 0 e adicionar após o substr. Além disso, você deve classificar as posições de baixo a alto para fazê-lo funcionar. Corrigi sua função aqui, convém editar seu código: pastebin.com/g9ADpuU4
Matthias S
@MatthiasS graças, da próxima vez apenas editar ou editar sugeriu, eu não perceber isso até 2 anos mais tarde
chiliNUT
1

Simples e outra maneira de resolver:

function stringInsert($str,$insertstr,$pos)
{
  $count_str=strlen($str);
  for($i=0;$i<$pos;$i++)
    {
    $new_str .= $str[$i];
    }

    $new_str .="$insertstr";

   for($i=$pos;$i<$count_str;$i++)
    {
    $new_str .= $str[$i];
    }

  return $new_str;

}  
jewelhuq
fonte
talvez também indique como a função é usada?
Rotimi
1
function insSubstr($str, $sub, $posStart, $posEnd){
  return mb_substr($str, 0, $posStart) . $sub . mb_substr($str, $posEnd + 1);
}
Ivan Ivan
fonte
$posEndé desnecessário. A questão era sobre a inserção de substring após a posição especificada.
Styx
Sim, mas eu fiz essa função para o meu projeto. onde eu precisava em algum lugar substituindo e em outro apenas inserindo. Minha função também está funcionando para essa pergunta, então não consigo entender por que você me menosou?
Ivan Ivan
0

Respostas estranhas aqui! Você pode inserir strings em outras strings facilmente com o sprintf [link para documentação]. A função é extremamente poderosa e também pode lidar com vários elementos e outros tipos de dados.

$color = 'green';
sprintf('I like %s apples.', $color);

dá-lhe a corda

I like green apples.
Sliq
fonte
1
Isso é bom. mas não lida com uma abordagem programática. Geralmente temos 'I like apples.'como variável. Portanto, temos que inserir %sprimeiro a string, que retorna ao problema original #
KeitelDOG