在指定位置插入字符串


269

有没有可以做到这一点的PHP函数?

我正在使用 strpos用来获取子字符串的位置,我想string在该位置之后插入一个。

Answers:


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

http://php.net/substr_replace


24
这应该是公认的答案。内置功能每天都优先于用户创建的功能。
杰姆

13
是的,第四个参数为“ 0”会导致替换字符串被插入而不会覆盖任何原始字符串。
Buttle Butkus 2014年

7
辉煌的答案。但是对于懒惰的人(例如我),也许您的帖子中应该有简短的解释。我现在将这样做,并从php.net复制'n'paste:“当然,如果长度为零,则此函数将具有在给定的起始偏移量处将替换插入字符串中的效果。”
Wolfsblvt 2015年

7
注意:函数substr_replace()不是多字节安全的!您的$ pos可能位于UTF-8字符的中间。您可能需要使用@ tim-cooper的解决方案,但要使用mb_substr()。
richplane


12

试试看,它将适用于任意数量的子字符串

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

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

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

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

7

使用stringInsert函数而不是putinplace函数。我正在使用更高版本的功能来解析mysql查询。尽管输出看起来还不错,但是查询导致了错误,这使我花了一些时间来查找。以下是我仅需一个参数的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先来。他没有说只找到一个职位。
xdazz11年

3

我有一个我以前的功能:

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谢谢,下一次只是编辑或建议编辑,直到两年后我才注意到这一点
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

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

$posEnd不需要。问题是关于在指定位置之后插入子字符串。
Styx

是的,但是我为我的项目做了此功能。我需要在某个地方替换并在另一个地方插入的地方。我的功能也在解决这个问题,所以我不明白你为什么要减去我?
伊万·伊凡

0

奇怪的答案在这里!您可以轻松地将字符串插入其他字符串 sprintf [链接到文档]。该功能非常强大,并且可以处理多个元素和其他数据类型。

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

给你字符串

I like green apples.

1
真好。但它不能处理程序化方法。我们通常有'I like apples.'一个变量。因此,我们必须%s首先在字符串中插入,这将返回原始问题
KeitelDOG,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.