Вставте рядок у вказаному положенні


270

Чи є функція PHP, яка може це зробити?

Я використовую strposдля отримання позиції підрядки, і я хочу вставити stringпісля цього положення.

Відповіді:


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

http://php.net/substr_replace


24
Це має бути прийнятою відповіддю. Вбудовані функції мають перевагу над створеними користувачем функціями в будь-який день.
Бенджам

13
Так, четвертий аргумент "0" призводить до того, що рядок повторного внесення вставляється без перезапису жодного вихідного рядка.
Бутлет Буткус

7
Блискуча відповідь. Але для ледачих (як я) можливо, у вашій посаді може бути коротке пояснення. Я зроблю це зараз і скопію'''''вставте з php.net: "Звичайно, якщо довжина дорівнює нулю, ця функція матиме ефект від вставлення заміни в рядок при заданому зсуві".
Wolfsblvt

7
Остерігайтеся: функція substr_replace () не є безпечною для багатоканальних даних! Ваш $ pos може виявитися посеред символу UTF-8. Можливо, вам доведеться використовувати рішення @ tim-cooper, але використовуючи mb_substr ().
richplane


12

Спробуйте, він буде працювати для будь-якої кількості підрядків

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

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

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

    // bca+++def a+++bcdef
?>

7

Використовуйте функцію stringInsert, а не функцію putinplace. Пізнішу функцію я використовував для розбору запиту mysql. Хоча результат виглядав нормально, запит призвів до помилки, яка потребувала певного часу, щоб відстежити. Далі йде моя версія функції stringInsert, що вимагає лише одного параметра.

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 Оп сказав 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

Просто хотів щось додати: я вважав відповідь Тім Купера дуже корисною, і я використав її для створення методу, який приймає масив позицій і робить вставку на всіх, щоб ось це:

EDIT: Схоже, моя стара функція передбачала$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;
}

1
Це не працює. Ваша зміна передбачає, що $ interstr буде довжиною всього 1 символ. Потрібно додати зміщення залежно від довжини вставлення, почати з 0 і додати після субстрату. Крім того, слід сортувати позиції від низької до високої, щоб вона працювала. Я виправив вашу функцію тут, можливо, ви захочете відредагувати свій код: 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;

}  

може також вказати, як використовується функція?
Ротімі

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.

1
Це мило. але це не обробляє програмний підхід. У нас зазвичай це 'I like apples.'є змінною. Тому ми повинні вставити %sспочатку в рядок, який повертається до початкової проблеми
KeitelDOG
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.