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.

Odpowiedzi:


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

http://php.net/substr_replace


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


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

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

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

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


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.

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

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;

}  

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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.