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.

Respuestas:


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

http://php.net/substr_replace


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


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
?>

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;
}  

4
str_replace($sub_str, $insert_str.$sub_str, $org_str);

@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.


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.

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;
}

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;

}  

¿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);
}

$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.

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.