แทรกสตริงที่ตำแหน่งที่ระบุ


270

มีฟังก์ชั่น PHP ที่สามารถทำได้หรือไม่?

ฉันใช้strposเพื่อรับตำแหน่งของสตริงย่อยและฉันต้องการแทรกstringหลังจากตำแหน่งนั้น

คำตอบ:


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

http://php.net/substr_replace


24
นี่ควรเป็นคำตอบที่ยอมรับได้ ฟังก์ชันในตัวมีความสำคัญเหนือกว่าฟังก์ชั่นที่ผู้ใช้สร้างขึ้นทุกวัน
Benjam

13
ใช่อาร์กิวเมนต์ที่ 4 เป็น "0" ทำให้สตริงที่เก็บซ้ำถูกแทรกโดยไม่เขียนทับสตริงเดิมใด ๆ
Buttle Butkus

7
คำตอบที่ยอดเยี่ยม แต่สำหรับคนขี้เกียจ (อย่างฉัน) น่าจะมีคำอธิบายสั้น ๆ ในโพสต์ของคุณ ฉันจะทำตอนนี้และ copy'n'paste จาก php.net: "แน่นอนถ้าความยาวเป็นศูนย์ฟังก์ชันนี้จะมีผลในการแทรกการแทนที่ลงในสตริงที่จุดเริ่มต้นที่กำหนด"
Wolfsblvt

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 The op กล่าวว่าusing strpos to get the position of a substringดังนั้นsubstringจะมาก่อน และเขาไม่ได้พูดว่าหาเพียงตำแหน่งเดียว
xdazz

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

@ Matiasias ขอบคุณครั้งต่อไปเพียงแค่แก้ไขหรือแก้ไขที่แนะนำฉันไม่ได้สังเกตเรื่องนี้อีก 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

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

$posEndไม่จำเป็น คำถามเกี่ยวกับการแทรกสตริงย่อยหลังจากตำแหน่งที่ระบุ
Styx

ใช่ แต่ฉันทำฟังก์ชั่นนี้สำหรับโครงการของฉัน ที่ฉันต้องการในบางแห่งการแทนที่และในอีกเพียงแค่แทรก ฟังก์ชั่นของฉันทำงานสำหรับคำถามนี้ด้วยดังนั้นฉันจึงไม่เข้าใจว่าทำไมคุณถึงลบฉัน
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.