Fügen Sie die Zeichenfolge an der angegebenen Position ein

269

Gibt es eine PHP-Funktion, die das kann?

Ich verwende strpos, um die Position eines Teilstrings zu ermitteln, und möchte einen stringnach dieser Position einfügen .

Alex
quelle

Antworten:

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

http://php.net/substr_replace

urmaul
quelle
24
Dies sollte die akzeptierte Antwort sein. Integrierte Funktionen haben jeden Tag Vorrang vor vom Benutzer erstellten Funktionen.
Benjam
13
Ja, das vierte Argument "0" bewirkt, dass die Replaecment-Zeichenfolge eingefügt wird, ohne dass die ursprüngliche Zeichenfolge überschrieben wird.
Buttle Butkus
7
Geniale Antwort. Aber für faule Leute (wie mich) sollte es vielleicht eine kurze Erklärung in Ihrem Beitrag geben. Ich mache es jetzt und kopiere und füge es von php.net ein: "Wenn die Länge Null ist, hat diese Funktion natürlich den Effekt, dass beim angegebenen Startversatz eine Ersetzung in den String eingefügt wird."
Wolfsblvt
7
Achtung: Die Funktion substr_replace () ist nicht multibyte-sicher! Ihr $ pos befindet sich möglicherweise mitten in einem UTF-8-Zeichen. Möglicherweise müssen Sie die Lösung von @ tim-Cooper verwenden, aber mb_substr () verwenden.
Richplane
72
$str = substr($oldstr, 0, $pos) . $str_to_insert . substr($oldstr, $pos);

substr im PHP-Handbuch

Tim Cooper
quelle
Ich habe mit dieser Zeile eine str_insert-Funktion erstellt, die wiederverwendbarer ist.
Djleop
12

Probieren Sie es aus, es funktioniert für eine beliebige Anzahl von Teilzeichenfolgen

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

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

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

    // bca+++def a+++bcdef
?>
alexdets
quelle
7

Verwenden Sie die Funktion stringInsert anstelle der Funktion putinplace. Ich habe die spätere Funktion verwendet, um eine MySQL-Abfrage zu analysieren. Obwohl die Ausgabe in Ordnung aussah, führte die Abfrage zu einem Fehler, bei dem ich eine Weile gebraucht habe, um ihn aufzuspüren. Das Folgende ist meine Version der Funktion stringInsert, für die nur ein Parameter erforderlich ist.

function stringInsert($str,$insertstr,$pos)
{
    $str = substr($str, 0, $pos) . $insertstr . substr($str, $pos);
    return $str;
}  
user2958137
quelle
4
str_replace($sub_str, $insert_str.$sub_str, $org_str);
xdazz
quelle
@minitech Die Operation sagte using strpos to get the position of a substring, also substringkommt die zuerst. Und er sagte nicht, nur eine Position zu finden.
Xdazz
3

Ich habe eine meiner alten Funktionen dafür:

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

Dies ist eine kleine leistungsstarke Funktion, die ihre Aufgabe einwandfrei erfüllt.

Ivijan Stefan Stipić
quelle
3

Dies war meine einfache Lösung, um Text an die nächste Zeile anzuhängen, nachdem das Schlüsselwort gefunden wurde.

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

Ausgabe:

This is a test
#FINDME#
Insert this awesome string below findme!!!
Other text and data.
Lance Badger
quelle
3

Ich wollte nur etwas hinzufügen: Ich fand die Antwort von Tim Cooper sehr nützlich. Ich habe sie verwendet, um eine Methode zu erstellen, die eine Reihe von Positionen akzeptiert und die Einfügung für alle von ihnen vornimmt, also hier:

BEARBEITEN: Es sieht so aus, als ob meine alte Funktion$insertstrnur 1 Zeichen angenommen hat und das Array sortiert wurde. Dies funktioniert für eine beliebige Zeichenlänge.

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
quelle
1
Das funktioniert nicht. Ihr Offset geht davon aus, dass $ interstr nur 1 Zeichen lang ist. Sie müssen den Offset abhängig von der Länge der Einfügung hinzufügen, mit 0 beginnen und nach dem Teil hinzufügen. Außerdem sollten Sie die Positionen niedrig bis hoch sortieren, damit es funktioniert. Ich habe Ihre Funktion hier korrigiert. Vielleicht möchten Sie Ihren Code bearbeiten: pastebin.com/g9ADpuU4
Matthias S
@ MatthiasS danke, das nächste Mal nur bearbeiten oder vorgeschlagen zu bearbeiten, habe ich dies erst 2 Jahre später
bemerkt
1

Einfach und ein anderer Weg zu lösen:

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
quelle
Vielleicht auch angeben, wie die Funktion verwendet wird?
Rotimi
1
function insSubstr($str, $sub, $posStart, $posEnd){
  return mb_substr($str, 0, $posStart) . $sub . mb_substr($str, $posEnd + 1);
}
Ivan Ivan
quelle
$posEndwird nicht benötigt. Die Frage betraf das Einfügen eines Teilstrings nach der angegebenen Position.
Styx
Ja, aber ich habe diese Funktion für mein Projekt gemacht. wo ich an einer Stelle ersetzen und an einer anderen nur einfügen musste. Meine Funktion funktioniert auch für diese Frage, also kann ich nicht verstehen, warum du mich minus hast?
Ivan Ivan
0

Seltsame Antworten hier! Mit sprintf [Link zur Dokumentation] können Sie Strings einfach in andere Strings einfügen . Die Funktion ist äußerst leistungsfähig und kann auch mehrere Elemente und andere Datentypen verarbeiten.

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

gibt Ihnen die Zeichenfolge

I like green apples.
Sliq
quelle
1
Das ist schön. Ein programmatischer Ansatz wird jedoch nicht behandelt. Wir haben normalerweise 'I like apples.'als Variable. Also müssen wir %szuerst in den String einfügen , der zum ursprünglichen Problem zurückkehrt
KeitelDOG