Chèn chuỗi vào vị trí đã chỉ định


270

Có một chức năng PHP có thể làm điều đó?

Tôi đang sử dụng strposđể có được vị trí của một chuỗi con và tôi muốn chèn vào stringsau vị trí đó.

Câu trả lời:


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

http://php.net/substr numplace


24
Đây phải là câu trả lời được chấp nhận. Các chức năng tích hợp được ưu tiên hơn các chức năng do người dùng tạo bất kỳ ngày nào.
Stewam

13
Có, đối số thứ 4 là "0" làm cho chuỗi từ chối được chèn mà không ghi đè lên bất kỳ chuỗi gốc nào.
Butussy Butkus

7
Rực rỡ trả lời. Nhưng đối với những người lười biếng (như tôi) nên có một lời giải thích ngắn trong bài viết của bạn. Tôi sẽ thực hiện ngay bây giờ và copy'n'paste từ php.net: "Tất nhiên, nếu độ dài bằng 0 thì hàm này sẽ có tác dụng chèn thay thế vào chuỗi ở phần bù bắt đầu đã cho."
Wolfsblvt

7
Cẩn thận: Hàm nền tảng () không phải là đa bào an toàn! $ Pos của bạn có thể nằm ở giữa ký tự UTF-8. Bạn có thể cần sử dụng giải pháp của @ tim-Cooper nhưng sử dụng mb_substr ().
Richplane


12

Hãy thử nó, nó sẽ làm việc cho bất kỳ số lượng các chuỗi con

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

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

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

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

7

Sử dụng hàm stringInsert thay vì hàm putinplace. Tôi đã sử dụng hàm sau để phân tích một truy vấn mysql. Mặc dù đầu ra trông ổn, nhưng truy vấn dẫn đến một lỗi khiến tôi mất một lúc để theo dõi. Sau đây là phiên bản của hàm stringInsert chỉ cần một tham số.

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 Các op nói using strpos to get the position of a substring, nên substringđến trước. Và anh không nói chỉ tìm một vị trí.
xdazz

3

Tôi có một chức năng cũ của tôi cho điều đó:

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

Đây là một chức năng nhỏ mạnh mẽ thực hiện công việc của mình một cách hoàn hảo.


3

Đây là giải pháp đơn giản của tôi, thêm văn bản vào dòng tiếp theo sau khi tìm thấy từ khóa.

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

Đầu ra:

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

3

Chỉ muốn thêm một cái gì đó: Tôi thấy câu trả lời của tim Cooper rất hữu ích, tôi đã sử dụng nó để tạo ra một phương thức chấp nhận một loạt các vị trí và thực hiện thao tác chèn vào tất cả chúng vì vậy đây là:

EDIT: Có vẻ như chức năng cũ của tôi giả sử$insertstrchỉ có 1 ký tự và mảng đã được sắp xếp. Điều này làm việc cho chiều dài nhân vật tùy ý.

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
Điều này không hoạt động. Phần bù của bạn giả sử $ interstr chỉ dài 1 ký tự. Bạn cần thêm offset tùy thuộc vào độ dài insertstr, bắt đầu bằng 0 và thêm sau lớp nền. Hơn nữa, bạn nên sắp xếp các vị trí thấp đến cao để làm cho nó hoạt động. Tôi đã sửa chức năng của bạn ở đây, bạn có thể muốn chỉnh sửa mã của mình: pastebin.com/g9ADpuU4
Matthias S

@MatthiasS cảm ơn, lần sau chỉ cần chỉnh sửa hoặc đề nghị chỉnh sửa, tôi đã không nhận thấy điều này cho đến 2 năm sau
chiliNUT

1

Đơn giản và một cách khác để giải quyết:

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;

}  

cũng có thể nói làm thế nào các chức năng được sử dụng?
Rotimi

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

$posEndlà không cần thiết. Câu hỏi là về việc chèn chuỗi con sau vị trí được chỉ định.
Styx

Có, nhưng tôi đã thực hiện chức năng này cho dự án của tôi. nơi tôi cần ở một nơi nào đó thay thế và ở một nơi khác chỉ cần chèn. Chức năng của tôi cũng hoạt động cho câu hỏi này, vì vậy tôi không thể hiểu tại sao bạn lại trừ tôi?
Ivan Ivan

0

Câu trả lời kỳ lạ ở đây! Bạn có thể chèn các chuỗi vào các chuỗi khác một cách dễ dàng bằng sprintf [link to document]. Chức năng này cực kỳ mạnh mẽ và có thể xử lý nhiều yếu tố và các loại dữ liệu khác.

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

cung cấp cho bạn chuỗi

I like green apples.

1
Điều đó thật tuyệt. nhưng nó không xử lý một cách tiếp cận theo chương trình. Chúng ta thường có 'I like apples.'một biến. Vì vậy, chúng ta phải chèn %sđầu tiên vào chuỗi, trở lại vấn đề ban đầu
KeitelDOG
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.