Insertar cadena en la posición especificada

270

¿Hay una función PHP que pueda hacer eso?

Estoy usando strpospara obtener la posición de una subcadena y quiero insertar una stringdespués de esa posición.

Alex
fuente

Respuestas:

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

http://php.net/substr_replace

urmaul
fuente
24
Esta debería ser la respuesta aceptada. Las funciones integradas tienen prioridad sobre las funciones creadas por el usuario cualquier día.
Benjam
13
Sí, el cuarto argumento es "0" y hace que la cadena de reemplazo se inserte sin sobrescribir ninguna de las cadenas originales.
Buttle Butkus
77
Brillante respuesta. Pero para la gente perezosa (como yo) debería haber una breve explicación en tu publicación. Lo haré ahora y copiaré y pegaré desde php.net: "Por supuesto, si la longitud es cero, esta función tendrá el efecto de insertar un reemplazo en una cadena en el desplazamiento de inicio dado".
Wolfsblvt
77
Cuidado: ¡la función substr_replace () no es segura para varios bytes! Su $ pos puede resultar estar en el medio de un personaje UTF-8. Puede que necesite emplear la solución de @ tim-cooper pero usando mb_substr ().
richplane
72
$str = substr($oldstr, 0, $pos) . $str_to_insert . substr($oldstr, $pos);

substr en PHP Manual

Tim Cooper
fuente
Hice una función str_insert con esta línea, es más reutilizable.
djleop
12

Pruébelo, funcionará para cualquier número de subcadenas

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

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

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

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

Use la función stringInsert en lugar de la función putinplace. Estaba usando la función posterior para analizar una consulta mysql. Aunque el resultado se veía bien, la consulta resultó en un error que me llevó un tiempo rastrear. La siguiente es mi versión de la función stringInsert que requiere solo un parámetro.

function stringInsert($str,$insertstr,$pos)
{
    $str = substr($str, 0, $pos) . $insertstr . substr($str, $pos);
    return $str;
}  
usuario2958137
fuente
4
str_replace($sub_str, $insert_str.$sub_str, $org_str);
xdazz
fuente
@minitech El operador dijo using strpos to get the position of a substring, así que lo substringprimero es lo primero. Y no dijo que encontrara solo una posición.
xdazz
3

Tengo una de mis antiguas funciones para eso:

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

Esta es una función pequeña y potente que realiza su trabajo sin problemas.

Ivijan Stefan Stipić
fuente
3

Esta fue mi solución simple también agregar texto a la siguiente línea después de encontrar la palabra clave.

$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!!!");

Salida:

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

Solo quería agregar algo: la respuesta de tim cooper me pareció muy útil, la usé para hacer un método que acepta una variedad de posiciones y hace la inserción en todas ellas, así que aquí está:

EDITAR: Parece que mi antigua función asumía que$insertstrsolo tenía 1 carácter y que la matriz estaba ordenada. Esto funciona para la longitud de caracteres arbitraria.

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
fuente
1
Esto no funciona. Su desplazamiento supone que $ interstr tiene solo 1 carácter de longitud. Debe agregar desplazamiento según la longitud de la inserción, comenzar con 0 y agregar después de la substr. Además, debe ordenar las posiciones de menor a mayor para que funcione. Corregí su función aquí, es posible que desee editar su código: pastebin.com/g9ADpuU4
Matthias S
@MatthiasS gracias, la próxima vez que solo edite o sugiera editar, no me di cuenta hasta 2 años después
chiliNUT
1

Simple y otra forma 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
fuente
¿quizás también indique cómo se usa la función?
Rotimi
1
function insSubstr($str, $sub, $posStart, $posEnd){
  return mb_substr($str, 0, $posStart) . $sub . mb_substr($str, $posEnd + 1);
}
Ivan Ivan
fuente
$posEndes innecesario La pregunta era sobre insertar una subcadena después de la posición especificada.
Styx
Sí, pero hice esta función para mi proyecto. donde necesitaba en algún lugar reemplazar y en otro simplemente insertar. Mi función también funciona para esta pregunta, así que no puedo entender por qué me hiciste menos?
Ivan Ivan
0

¡Respuestas extrañas aquí! Puede insertar cadenas en otras cadenas fácilmente con sprintf [enlace a la documentación]. La función es extremadamente poderosa y puede manejar múltiples elementos y otros tipos de datos también.

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

te da la cuerda

I like green apples.
Sliq
fuente
1
Eso es bueno. pero no maneja un enfoque programático. Generalmente tenemos 'I like apples.'como una variable. Así que tenemos que insertar %sprimero en la cadena, que vuelve al problema original
KeitelDOG