Відповіді:
$newstr = substr_replace($oldstr, $str_to_insert, $pos, 0);
$str = substr($oldstr, 0, $pos) . $str_to_insert . substr($oldstr, $pos);
Використовуйте функцію stringInsert, а не функцію putinplace. Пізнішу функцію я використовував для розбору запиту mysql. Хоча результат виглядав нормально, запит призвів до помилки, яка потребувала певного часу, щоб відстежити. Далі йде моя версія функції stringInsert, що вимагає лише одного параметра.
function stringInsert($str,$insertstr,$pos)
{
$str = substr($str, 0, $pos) . $insertstr . substr($str, $pos);
return $str;
}
У мене є одна моя стара функція для цього:
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
Це невелика потужна функція, яка виконує свою роботу бездоганно.
Це моє просте рішення також додало текст до наступного рядка після того, як він знайшов ключове слово.
$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.
Просто хотів щось додати: я вважав відповідь Тім Купера дуже корисною, і я використав її для створення методу, який приймає масив позицій і робить вставку на всіх, щоб ось це:
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;
}
Простий та інший спосіб вирішити:
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
є зайвим. Питання стосувалося вставки підрядків після зазначеної позиції.
Дивні відповіді тут! Ви можете легко вставити рядки в інші рядки за допомогою sprintf [посилання на документацію]. Ця функція надзвичайно потужна і може працювати з декількома елементами та іншими типами даних.
$color = 'green';
sprintf('I like %s apples.', $color);
дає вам рядок
I like green apples.
'I like apples.'
є змінною. Тому ми повинні вставити %s
спочатку в рядок, який повертається до початкової проблеми