Yanıtlar:
$newstr = substr_replace($oldstr, $str_to_insert, $pos, 0);
$str = substr($oldstr, 0, $pos) . $str_to_insert . substr($oldstr, $pos);
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;
}
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.
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.
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$insertstr
sadece 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;
}
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;
}
function insSubstr($str, $sub, $posStart, $posEnd){
return mb_substr($str, 0, $posStart) . $sub . mb_substr($str, $posEnd + 1);
}
$posEnd
gereksizdir. Soru, belirtilen konumdan sonra alt dize eklemekti.
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.
'I like apples.'
bir değişken olarak var. Bu yüzden %s
ilk önce orijinal soruna geri dönen dizeyi