Вставить строку в указанной позиции

270

Есть ли функция PHP, которая может сделать это?

Я использую, strposчтобы получить позицию подстроки, и я хочу вставить stringпосле этой позиции.

Alex
источник

Ответы:

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

http://php.net/substr_replace

urmaul
источник
24
Это должен быть принятый ответ. Встроенные функции имеют приоритет над пользовательскими функциями в любой день.
Бенджам
13
Да, 4-й аргумент, равный «0», вызывает вставку замещающей строки без перезаписи любой исходной строки.
Баттл Буткус
7
Блестящий ответ. Но для ленивых людей (таких как я) в вашем посте должно быть краткое объяснение. Я сделаю это сейчас и скопирую n'paste из php.net: «Конечно, если длина равна нулю, эта функция будет иметь эффект вставки замены в строку с заданным начальным смещением».
Wolfsblvt
7
Осторожно: функция substr_replace () не является многобайтовой! Ваш $ pos может оказаться в середине символа UTF-8. Возможно, вам придется использовать решение @ tim-cooper, но с помощью mb_substr ().
richplan
72
$str = substr($oldstr, 0, $pos) . $str_to_insert . substr($oldstr, $pos);

substr на PHP Руководство

Тим Купер
источник
Я сделал функцию str_insert с этой строкой, она более пригодна для повторного использования.
djleop
12

Попробуйте, это будет работать для любого количества подстрок

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

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

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

    // bca+++def a+++bcdef
?>
alexdets
источник
7

Используйте функцию stringInsert, а не функцию putinplace. Я использовал более позднюю функцию для анализа запроса MySQL. Хотя вывод выглядел хорошо, запрос привел к ошибке, которая заняла у меня некоторое время, чтобы отследить. Ниже приведена моя версия функции stringInsert, для которой требуется только один параметр.

function stringInsert($str,$insertstr,$pos)
{
    $str = substr($str, 0, $pos) . $insertstr . substr($str, $pos);
    return $str;
}  
user2958137
источник
4
str_replace($sub_str, $insert_str.$sub_str, $org_str);
xdazz
источник
@minitech оп сказал using strpos to get the position of a substring, так что на substringпервом месте. И он не сказал найти только одну позицию.
xdazz
3

У меня есть одна моя старая функция для этого:

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

Это небольшая мощная функция, которая выполняет свою работу без нареканий.

Ивиян Стефан Стипич
источник
3

Это было мое простое решение: добавить текст в следующую строку после того, как было найдено ключевое слово.

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

Вывод:

This is a test
#FINDME#
Insert this awesome string below findme!!!
Other text and data.
Лэнс Барсук
источник
3

Просто хотел кое-что добавить: я нашел ответ Тима Купера очень полезным, я использовал его, чтобы создать метод, который принимает массив позиций и выполняет вставку для всех из них, вот так:

РЕДАКТИРОВАТЬ: похоже, моя старая функция предполагала, что$insertstrбыл только 1 символ, и что массив был отсортирован. Это работает для произвольной длины символа.

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
источник
1
Это не работает. Ваше смещение предполагает, что $ interstr будет длиной всего 1 символ. Вам нужно добавить смещение в зависимости от длины вставки, начните с 0 и добавьте после substr. Кроме того, вы должны сортировать позиции по убыванию, чтобы это работало. Я исправил вашу функцию здесь, вы можете отредактировать свой код: pastebin.com/g9ADpuU4
Matthias S
@MatthiasS спасибо, в следующий раз просто отредактируй или предложи отредактировать, я не заметил этого до 2 лет спустя
chiliNUT
1

Простой и еще один способ решить:

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
источник
может также указать, как используется эта функция?
Ротими
1
function insSubstr($str, $sub, $posStart, $posEnd){
  return mb_substr($str, 0, $posStart) . $sub . mb_substr($str, $posEnd + 1);
}
Иван Иван
источник
$posEndне требуется Вопрос был о вставке подстроки после указанной позиции.
Styx
Да, но я сделал эту функцию для своего проекта. где мне нужно в одном месте заменить, а в другом просто вставить. Моя функция работает и для этого вопроса, так что я не могу понять, почему ты меня минус?
Иван Иван
0

Странные ответы здесь! Вы можете легко вставлять строки в другие строки с помощью sprintf [ссылка на документацию]. Функция очень мощная и может обрабатывать несколько элементов и других типов данных.

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

дает вам строку

I like green apples.
SliQ
источник
1
Это мило. но это не обрабатывает программный подход. Мы обычно имеем 'I like apples.'в качестве переменной. Таким образом, мы должны вставить %sсначала в строку, которые возвращаются к исходной задаче
KeitelDOG