Wstaw ciąg w określonej pozycji

269

Czy istnieje funkcja PHP, która może to zrobić?

Używam, strposaby uzyskać pozycję podciągu i chcę wstawić stringpo tej pozycji.

Alex
źródło

Odpowiedzi:

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

http://php.net/substr_replace

urmaul
źródło
24
To powinna być zaakceptowana odpowiedź. Wbudowane funkcje mają pierwszeństwo przed funkcjami tworzonymi przez użytkownika każdego dnia.
Benjam
13
Tak, czwarty argument będący „0” powoduje, że łańcuch replaecmentu jest wstawiany bez nadpisywania oryginalnego łańcucha.
Buttle Butkus
7
Genialna odpowiedź. Ale dla leniwych ludzi (takich jak ja) może być krótkie wyjaśnienie w twoim poście. Zrobię to teraz i skopiuj i wklej z php.net: „Oczywiście, jeśli długość wynosi zero, to funkcja ta spowoduje wstawienie zamiany do łańcucha przy danym przesunięciu początkowym.”
Wolfsblvt
7
Uwaga: funkcja substr_replace () nie jest bezpieczna dla wielu bajtów! Twój $ pos może być w środku znaku UTF-8. Być może będziesz musiał zastosować rozwiązanie @ tim-cooper, ale używając mb_substr ().
richplane
72
$str = substr($oldstr, 0, $pos) . $str_to_insert . substr($oldstr, $pos);

substr na PHP Manual

Tim Cooper
źródło
Zrobiłem funkcję str_insert z tą linią, jest ona bardziej wielokrotnego użytku.
djleop,
12

Wypróbuj, będzie działać na dowolnej liczbie podciągów

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

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

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

    // bca+++def a+++bcdef
?>
alexdets
źródło
7

Użyj funkcji stringInsert zamiast funkcji putinplace. Użyłem późniejszej funkcji do analizy zapytania mysql. Mimo że wynik wyglądał dobrze, zapytanie spowodowało błąd, którego wyśledzenie zajęło mi trochę czasu. Oto moja wersja funkcji stringInsert wymagającej tylko jednego parametru.

function stringInsert($str,$insertstr,$pos)
{
    $str = substr($str, 0, $pos) . $insertstr . substr($str, $pos);
    return $str;
}  
użytkownik2958137
źródło
4
str_replace($sub_str, $insert_str.$sub_str, $org_str);
xdazz
źródło
@minitech Op powiedział using strpos to get the position of a substring, więc substringjest na pierwszym miejscu. I nie powiedział, żeby znaleźć tylko jedną pozycję.
xdazz 24.11.11
3

Mam do tego jedną moją starą funkcję:

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

Jest to niewielka, potężna funkcja, która wykonuje swoją pracę bezbłędnie.

Ivijan Stefan Stipić
źródło
3

To było moje proste rozwiązanie - po znalezieniu słowa kluczowego dodaj tekst do następnego wiersza.

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

Wynik:

This is a test
#FINDME#
Insert this awesome string below findme!!!
Other text and data.
Lance Badger
źródło
3

Chciałem tylko coś dodać: uznałem odpowiedź Tim Coopera za bardzo przydatną, wykorzystałem ją do stworzenia metody, która akceptuje tablicę pozycji i wstawia na nich wszystkie, więc oto:

EDYCJA: Wygląda na to, że moja stara funkcja$insertstrmiała tylko 1 znak i że tablica została posortowana. Działa to dla dowolnej długości znaków.

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
źródło
1
To nie działa. Przesunięcie zakłada, że ​​$ interstr ma tylko 1 znak. Musisz dodać przesunięcie w zależności od długości insertstr, zacząć od 0 i dodać po substr. Ponadto należy posortować pozycje od najniższej do najwyższej, aby działało. Poprawiłem tutaj twoją funkcję, możesz chcieć edytować kod: pastebin.com/g9ADpuU4
Matthias S
@MatthiasS dzięki, następnym razem po prostu edytuj lub sugeruj edycję, nie zauważyłem tego do 2 lat później
chiliNUT
1

Prosty i inny sposób rozwiązania:

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
źródło
może również określić, w jaki sposób funkcja jest używana?
Rotimi,
1
function insSubstr($str, $sub, $posStart, $posEnd){
  return mb_substr($str, 0, $posStart) . $sub . mb_substr($str, $posEnd + 1);
}
Ivan Ivan
źródło
$posEndjest niepotrzebny. Pytanie dotyczyło wstawienia podciągu po określonej pozycji.
Styx
Tak, ale stworzyłem tę funkcję dla mojego projektu. gdzie w niektórych miejscach potrzebowałem wymiany, aw innym właśnie wstawienia. Moja funkcja również działa na to pytanie, więc nie mogę zrozumieć, dlaczego mnie pominęłeś?
Ivan Ivan
0

Dziwne odpowiedzi tutaj! Możesz łatwo wstawiać ciągi do innych ciągów za pomocą sprintf [link do dokumentacji]. Ta funkcja jest niezwykle wydajna i może obsługiwać wiele elementów oraz inne typy danych.

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

daje ci ciąg

I like green apples.
Sliq
źródło
1
To miłe. ale nie obsługuje podejścia programowego. Zwykle mamy 'I like apples.'jako zmienną. Musimy więc wstawić %spierwszy ciąg, który powraca do pierwotnego problemu
KeitelDOG