Masukkan string pada posisi yang ditentukan


270

Apakah ada fungsi PHP yang bisa melakukan itu?

Saya menggunakan strposuntuk mendapatkan posisi substring dan saya ingin memasukkan stringsetelah posisi itu.

Jawaban:


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

http://php.net/substr_replace


24
Ini harus menjadi jawaban yang diterima. Fungsi bawaan lebih diutamakan daripada fungsi yang dibuat pengguna setiap hari.
Benjam

13
Ya, argumen ke-4 menjadi "0" menyebabkan string replaecment dimasukkan tanpa menimpa salah satu string asli.
Buttle Butkus

7
Jawaban yang brilian. Tetapi untuk orang-orang malas (seperti saya) harus ada penjelasan singkat di posting Anda mungkin. Saya akan melakukannya sekarang dan menyalin'n'paste dari php.net: "Tentu saja, jika panjangnya nol maka fungsi ini akan memiliki efek memasukkan penggantian ke dalam string pada awal offset yang diberikan."
Wolfsblvt

7
Hati-hati: Fungsi substr_replace () tidak aman multibyte! $ Pos Anda mungkin berubah di tengah karakter UTF-8. Anda mungkin perlu menggunakan solusi @ tim-cooper tetapi menggunakan mb_substr ().
richplane


12

Cobalah, ini akan berfungsi untuk sejumlah substring

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

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

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

    // bca+++def a+++bcdef
?>

7

Gunakan fungsi stringInsert daripada fungsi putinplace. Saya menggunakan fungsi selanjutnya untuk mem-parsing permintaan mysql. Meskipun output tampak baik-baik saja, kueri menghasilkan kesalahan yang membutuhkan waktu beberapa saat untuk melacak. Berikut ini adalah versi saya dari fungsi stringInsert yang hanya membutuhkan satu parameter.

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 mengatakan using strpos to get the position of a substring, jadi yang substringpertama datang. Dan dia tidak mengatakan hanya menemukan satu posisi.
xdazz

3

Saya punya satu fungsi lama untuk itu:

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

Ini adalah fungsi kecil yang kuat yang melakukan tugasnya dengan sempurna.


3

Ini adalah solusi sederhana saya juga menambahkan teks ke baris berikutnya setelah menemukan kata kunci.

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

Keluaran:

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

3

Hanya ingin menambahkan sesuatu: Saya menemukan jawaban tim cooper sangat berguna, saya menggunakannya untuk membuat metode yang menerima berbagai posisi dan melakukan penyisipan pada semuanya jadi di sini yaitu:

EDIT: Sepertinya fungsi lama saya diasumsikan$insertstrhanya 1 karakter dan array diurutkan. Ini berfungsi untuk panjang karakter sewenang-wenang.

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
Ini tidak bekerja. Offset Anda mengasumsikan $ interstr hanya sepanjang 1 karakter. Anda perlu menambahkan offset tergantung pada panjang insertstr, mulai dengan 0 dan tambahkan setelah substr. Selanjutnya Anda harus mengurutkan posisi rendah ke tinggi untuk membuatnya berfungsi. Saya mengoreksi fungsi Anda di sini, Anda mungkin ingin mengedit kode Anda: pastebin.com/g9ADpuU4
Matthias S

@Matthias terima kasih, lain kali edit atau saran edit, saya tidak melihat ini sampai 2 tahun kemudian
chiliNUT

1

Sederhana dan cara lain untuk menyelesaikan:

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;

}  

mungkin juga menyatakan bagaimana fungsi tersebut digunakan?
Rotimi

1
function insSubstr($str, $sub, $posStart, $posEnd){
  return mb_substr($str, 0, $posStart) . $sub . mb_substr($str, $posEnd + 1);
}

$posEndtidak dibutuhkan. Pertanyaannya adalah tentang memasukkan substring setelah posisi yang ditentukan.
Styx

Ya, tetapi saya membuat fungsi ini untuk proyek saya. di mana saya perlu di suatu tempat mengganti dan di lain hanya menyisipkan. Fungsi saya juga berfungsi untuk pertanyaan ini, jadi saya tidak mengerti mengapa Anda mengurangi saya?
Ivan Ivan

0

Jawaban aneh di sini! Anda dapat memasukkan string ke string lain dengan mudah dengan sprintf [tautan ke dokumentasi]. Fungsi ini sangat kuat dan dapat menangani banyak elemen dan tipe data lainnya juga.

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

memberi Anda string

I like green apples.

1
Itu bagus. tetapi tidak menangani pendekatan terprogram. Kami biasanya memiliki 'I like apples.'variabel. Jadi kita harus memasukkan %sdulu ke dalam string, yang kembali ke masalah semula
KeitelDOG
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.