Odpowiedzi:
$newstr = substr_replace($oldstr, $str_to_insert, $pos, 0);
$str = substr($oldstr, 0, $pos) . $str_to_insert . substr($oldstr, $pos);
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;
}
str_replace($sub_str, $insert_str.$sub_str, $org_str);
using strpos to get the position of a substring
, więc substring
jest na pierwszym miejscu. I nie powiedział, żeby znaleźć tylko jedną pozycję.
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.
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.
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$insertstr
miał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;
}
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;
}
function insSubstr($str, $sub, $posStart, $posEnd){
return mb_substr($str, 0, $posStart) . $sub . mb_substr($str, $posEnd + 1);
}
$posEnd
jest niepotrzebny. Pytanie dotyczyło wstawienia podciągu po określonej pozycji.
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.
'I like apples.'
jako zmienną. Musimy więc wstawić %s
pierwszy ciąg, który powraca do pierwotnego problemu