Dizeyi belirtilen konuma ekle


270

Bunu yapabilen bir PHP işlevi var mı?

strposBir alt dize konumunu almak için kullanıyorum ve stringbu konumdan sonra bir eklemek istiyorum .

Yanıtlar:


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

http://php.net/substr_replace


24
Bu kabul edilen cevap olmalı. Yerleşik işlevler, her gün kullanıcı tarafından oluşturulan işlevlere göre önceliklidir.
Benjam

13
Evet, 4. bağımsız değişken "0" olup, özgün dizenin üzerine yazılmadan yeniden dizesinin eklenmesine neden olur.
Buttle Butkus

7
Mükemmel cevap. Ama tembel insanlar için (benim gibi) belki de yazında kısa bir açıklama olmalı. Şimdi yapacağım ve php.net'ten copy'n'paste: "Tabii ki, eğer uzunluk sıfırsa, bu fonksiyon verilen başlangıç ​​ofsetinde dizeye yedek ekleme etkisine sahip olacaktır."
Wolfsblvt

7
Dikkat: substr_replace () işlevi çok baytlı güvenli değildir! $ Pos değeriniz UTF-8 karakterinin ortasında olabilir. Mb_substr () kullanarak @ tim-cooper çözümünü kullanmanız gerekebilir.
richplane


12

Deneyin, herhangi bir sayıda alt dize için çalışacaktır

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

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

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

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

7

Putinplace işlevi yerine stringInsert işlevini kullanın. Bir mysql sorgusu ayrıştırmak için sonraki işlevi kullanıyordum. Çıktının iyi görünmesine rağmen, sorgu izlemem biraz zaman alan bir hatayla sonuçlandı. Aşağıda, yalnızca bir parametre gerektiren stringInsert işlevinin sürümü yer almaktadır.

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 Opera dedi using strpos to get the position of a substring, önce substringgelir. Ve sadece tek bir pozisyon bulduğunu söylemedi.
xdazz

3

Bunun için eski bir işlevim var:

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

Bu, işini kusursuz bir şekilde gerçekleştiren küçük ve güçlü bir işlevdir.


3

Bu benim basit çözümüm de anahtar kelimeyi bulduktan sonra bir sonraki satıra metin eklemek oldu.

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

Çıktı:

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

3

Sadece bir şey eklemek istedim: Tim Cooper'ın cevabını çok yararlı buldum, bir dizi pozisyonu kabul eden ve hepsini ekleyen bir yöntem yapmak için kullandım:

EDIT: Görünüşe göre benim eski işlevi$insertstrsadece 1 karakter olduğunu ve dizi sıralanmış olduğunuvarsayalım. Bu, rastgele karakter uzunluğu için çalışır.

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
Bu çalışmıyor. Uzaklığınız $ interstr karakterinin sadece 1 karakter uzunluğunda olduğunu varsayar. Insertstr uzunluğuna bağlı olarak ofset eklemeniz, 0 ile başlamanız ve substr'den sonra eklemeniz gerekir. Dahası, çalışması için pozisyonları alçaktan yükseğe doğru sıralamanız gerekir. Burada işlevinizi düzelttim, kodunuzu düzenlemek isteyebilirsiniz: pastebin.com/g9ADpuU4
Matthias S

@MatthiasS teşekkürler, bir dahaki sefere sadece düzenleme veya önerilen düzenleme, bunu 2 yıl sonra fark etmedim
chiliNUT

1

Basit ve çözmenin başka bir yolu:

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;

}  

fonksiyonun nasıl kullanıldığını da belirtebilir misiniz?
Rotimi

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

$posEndgereksizdir. Soru, belirtilen konumdan sonra alt dize eklemekti.
Styx

Evet, ama bu işlevi projem için yaptım. nerede bir yerde değiştirilmesi ve başka bir sadece ekleme gerekli. İşlevim de bu soru için çalışıyor, bu yüzden neden beni eksi yaptın anlayamıyorum?
Ivan Ivan

0

Garip cevaplar burada! Sprintf [belgelere bağlantı] ile dizeleri diğer dizelere kolayca ekleyebilirsiniz . İşlev son derece güçlüdür ve birden fazla öğeyi ve diğer veri türlerini de işleyebilir.

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

sana ipi verir

I like green apples.

1
Bu iyi. fakat programlı bir yaklaşımla uğraşmaz. Genellikle 'I like apples.'bir değişken olarak var. Bu yüzden %silk önce orijinal soruna geri dönen dizeyi
eklemeliyiz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.