Str_replace สำหรับหลายรายการ


115

ฉันจำได้ว่าเคยทำสิ่งนี้มาก่อน แต่หารหัสไม่เจอ ฉันใช้ str_replace เพื่อแทนที่อักขระหนึ่งตัวแบบนี้str_replace(':', ' ', $string);แต่ฉันต้องการแทนที่อักขระต่อไปนี้ทั้งหมด\/:*?"<>|โดยไม่ต้องทำ str_replace สำหรับแต่ละตัว


2
คุณต้องการแทนที่อักขระเหล่านี้ทั้งหมดด้วยช่องว่างหรือไม่?
Book Of Zeus

7
อย่ากลัวที่จะอ้างอิงคู่มือ php.net ที่ยอดเยี่ยมและตรวจสอบส่วน paramsเพื่อดูว่าสิ่งที่คุณต้องการเป็นไปได้หรือไม่
Mike B

คำตอบ:


117

str_replace() สามารถรับอาร์เรย์ดังนั้นคุณสามารถทำได้:

$new_str = str_replace(str_split('\\/:*?"<>|'), ' ', $string);

หรือคุณสามารถใช้preg_replace():

$new_str = preg_replace('~[\\\\/:*?"<>|]~', ' ', $string);

2
สมมติว่า OP หมายความว่าควรเปลี่ยนแบ็กสแลชรูปแบบ preg_replace นั้นใช้ไม่ได้กับฉัน เพื่อให้แบ็กสแลชทำงานตามที่คาดไว้ฉันต้องใช้ 4 อัน (เช่น "\\\\") ในรูปแบบ
GreenMatt

1
คำตอบที่ดีการเพิ่มคำตอบ @dogbert จะทำให้สมบูรณ์สำหรับผู้ที่ไม่อ่านคู่มือและไม่ทราบว่า str_split ส่งคืนอาร์เรย์
Bradmage

ข้อดีของstr_replace()Over preg_replace()(หรือในทางกลับกัน) ในกรณีของ OP คืออะไร?
ludditedev

1
@ludditedev ไม่มีข้อได้เปรียบที่แท้จริงทั้งสองทางเป็นเพียงเรื่องของความชอบ
NullUserException

1
@MadhurBhaiya เปลี่ยน regex เป็น'~[\\+><-]~'(สังเกตว่าอยู่ที่ไหน-) เส้นประ ( -) เป็นอักขระเมตาของนิพจน์ทั่วไปดังนั้นจึงจำเป็นต้องใช้ Escape หรือวางกลยุทธ์ในคลาสอักขระ (ทุกอย่างภายใน[]) ดูคำตอบนี้: stackoverflow.com/a/7604888/396458
NullUserException

181

แบบนี้:

str_replace(array(':', '\\', '/', '*'), ' ', $string);

หรือใน PHP สมัยใหม่ (ตั้งแต่ 5.4 เป็นต้นไป) คำน้อยกว่าเล็กน้อย:

str_replace([':', '\\', '/', '*'], ' ', $string);

73

ตัวอย่างเช่นหากคุณต้องการแทนที่ search1 ด้วย replace1 และ search2 ด้วย replace2 โค้ดต่อไปนี้จะทำงาน:

print str_replace(
    array("search1","search2"),
    array("replace1", "replace2"),
    "search1 search2"
);

// เอาต์พุต: replace1 replace2




2

คุณสามารถใช้preg_replace () ตัวอย่างต่อไปนี้สามารถเรียกใช้โดยใช้บรรทัดคำสั่ง php:

<?php
$s1 = "the string \\/:*?\"<>|";
$s2 = preg_replace("^[\\\\/:\*\?\"<>\|]^", " ", $s1) ;
echo "\n\$s2: \"" . $s2 . "\"\n";
?>

เอาท์พุท:

$ s2: "สตริง"


การหลบหนีภายในคลาสอักขระมากเกินไป (ดูคำตอบที่ยอมรับ)
mickmackusa

0

ฉันมีสถานการณ์ที่ฉันต้องแทนที่แท็ก HTML ด้วยผลลัพธ์การแทนที่ที่แตกต่างกันสองรายการ

$trades = "<li>Sprinkler and Fire      Protection Installer</li>
<li>Steamfitter </li>
<li>Terrazzo, Tile and Marble      Setter</li>";

$s1 =  str_replace('<li>', '"', $trades);

$s2 = str_replace('</li>', '",', $s1);

echo $s2;

ผลลัพธ์

"สปริงเกลอร์และตัวติดตั้งระบบป้องกันอัคคีภัย", "Steamfitter", "Terrazzo, Tile and Marble Setter",


0

ฉันเดาว่าคุณกำลังดูแลสิ่งนี้:

// example
private const TEMPLATE = __DIR__.'/Resources/{type}_{language}.json';

...

public function templateFor(string $type, string $language): string
{
   return \str_replace(['{type}', '{language}'], [$type, $language], self::TEMPLATE);
}

0

ในกรณีการใช้งานของฉันฉันกำหนดพารามิเตอร์บางฟิลด์ในเอกสาร HTML และเมื่อฉันโหลดฟิลด์เหล่านี้ฉันจับคู่และแทนที่ด้วยเมธอด str_replace

<?php echo str_replace(array("{{client_name}}", "{{client_testing}}"), array('client_company_name', 'test'), 'html_document'); ?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.