指定した位置に文字列を挿入する


270

それを行うことができるPHP関数はありますか?

strpos部分文字列の位置を取得するために使用していて、その位置のstring後にを挿入したいと思います。

回答:


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

http://php.net/substr_replace


24
これは受け入れられる答えになるはずです。組み込み関数は、いつでもユーザーが作成した関数よりも優先されます。
Benjam 2013年

13
はい、4番目の引数が "0"の場合、元の文字列を上書きせずに置換文字列が挿入されます。
バトルButkus 14

7
素晴らしい答え。しかし、怠惰な人々(私のような)の場合、投稿に簡単な説明があるはずです。ここで、php.netからコピーして貼り付けます。「もちろん、長さがゼロの場合、この関数は、指定された開始オフセットで文字列に置換を挿入する効果があります。」
Wolfsblvt 2015年

7
注意:関数substr_replace()はマルチバイトに対して安全ではありません!$ posがUTF-8文字の真ん中にあることが判明する場合があります。@ tim-cooperのソリューションを採用する必要があるかもしれませんが、mb_substr()を使用します。
richplane '19


12

試してみてください、それは任意の数の部分文字列で機能します

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

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

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

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

7

putinplace関数ではなくstringInsert関数を使用します。後者の関数を使用してmysqlクエリを解析していました。出力は問題ないように見えましたが、クエリによりエラーが発生し、追跡に時間がかかりました。以下は、パラメーターが1つだけ必要な私のバージョンのstringInsert関数です。

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オペアンプは言ったusing strpos to get the position of a substringので、substring最初に来る。そして、彼はただ一つのポジションを見つけるとは言いませんでした。
xdazz

3

そのための古い関数が1つあります。

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

これは、その機能を完璧に実行する小さな強力な機能です。


3

これは私の単純な解決策でもあり、キーワードが見つかった後、次の行にテキストを追加しました。

$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.

3

何かを追加したかっただけです。私はtim cooperの答えが非常に便利であることに気づきました。それを使用して、位置の配列を受け入れ、それらすべてに挿入を行うメソッドを作成しました。

編集:私の古い関数$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;
}

1
これは動作しません。オフセットでは、$ interstrの長さが1文字であると想定しています。insertstrの長さに応じてオフセットを追加し、0から開始してsubstrの後に追加する必要があります。さらに、それを機能させるために、ポジションを低いものから高いものへと並べ替えるべきです。ここで関数を修正しました。コードを編集してください:pastebin.com/g9ADpuU4
Matthias S

@MatthiasSのおかげで、次回は単に編集または提案された編集ですが、2年後までこのことに気付きませんでした
chiliNUT

1

シンプルで解決する別の方法:

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;

}  

関数の使用方法も記載されているでしょうか?
Rotimi 2018

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

$posEnd不要です。問題は、指定された位置の後に部分文字列を挿入することでした。
Styx 2017

はい、しかし私は私のプロジェクトのためにこの機能を作りました。どこかで交換が必要な場所と別の場所で挿入する場所 私の機能もこの質問に対して機能しているので、なぜあなたが私を差し引いたのか理解できません。
Ivan Ivan

0

ここで奇妙な答え!sprintf [ドキュメントへのリンク]を使用すると、文字列を他の文字列に簡単に挿入できます。この関数は非常に強力で、複数の要素や他のデータ型も処理できます。

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

あなたに文字列を与える

I like green apples.

1
それはすばらしい。ただし、プログラムによるアプローチは処理しません。通常は'I like apples.'変数として持っています。したがって%s、最初に文字列を挿入する必要があります。これにより、元の問題に戻ります
KeitelDOG
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.