Str_replace untuk beberapa item

115

Saya ingat melakukan ini sebelumnya, tetapi tidak dapat menemukan kodenya. Saya menggunakan str_replace untuk mengganti satu karakter seperti ini: str_replace(':', ' ', $string);tetapi saya ingin mengganti semua karakter berikut \/:*?"<>|, tanpa melakukan str_replace untuk masing-masing.

sebaya
sumber
2
Anda ingin mengganti semua karakter ini dengan spasi?
Book Of Zeus
7
Jangan takut untuk mereferensikan manual php.net yang sangat baik dan tinjau bagian params untuk melihat apakah yang Anda inginkan itu mungkin.
Mike B

Jawaban:

117

str_replace() dapat mengambil array, jadi Anda dapat melakukan:

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

Alternatifnya Anda bisa menggunakan preg_replace():

$new_str = preg_replace('~[\\\\/:*?"<>|]~', ' ', $string);
NullUserException
sumber
2
Dengan asumsi OP berarti garis miring terbalik harus diganti, pola preg_replace tidak berfungsi untuk saya. Untuk membuat garis miring terbalik bekerja seperti yang diharapkan, saya harus menggunakan 4 dari mereka (yaitu "\\\\") dalam pola.
GreenMatt
1
Jawaban yang bagus, menambahkan jawaban @dogbert akan membuatnya lengkap bagi orang-orang yang tidak membaca manual dan tidak menyadari str_split mengembalikan sebuah array.
Bradmage
Apa keuntungan dari str_replace()over preg_replace()(atau sebaliknya) dalam kasus OP?
ludditedev
1
@ludditedev Tidak ada keuntungan nyata, ini hanya masalah preferensi
NullUserException
1
@MadhurBhaiya Ubah regex ke '~[\\+><-]~'(perhatikan di mana -is). Tanda hubung ( -) adalah karakter meta regex, jadi perlu di-escape atau ditempatkan secara strategis di kelas karakter (semua yang ada di dalamnya []). Lihat jawaban ini: stackoverflow.com/a/7604888/396458
NullUserException
179

Seperti ini:

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

Atau, dalam PHP modern (mulai dari 5.4 dan seterusnya), sedikit lebih tidak bertele-tele:

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

Misalnya , jika Anda ingin mengganti search1 dengan replace1 dan search2 dengan replace2 maka kode berikut akan berfungsi:

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

// Keluaran: replace1 replace2

Sumoanand
sumber
48
str_replace(
    array("search","items"),
    array("replace", "items"),
    $string
);
Marty
sumber
6

Jika Anda hanya mengganti karakter tunggal, Anda harus menggunakan strtr()

Pil Ledakan
sumber
2
Karakter tunggal saja? Bagaimana bisa?
Jimmy Kane
2

Anda bisa menggunakan preg_replace () . Contoh berikut dapat dijalankan menggunakan baris perintah php:

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

Keluaran:

$ s2: "string"

GreenMatt
sumber
Terlalu banyak melarikan diri di dalam kelas karakter. (lihat jawaban yang diterima)
mickmackusa
0

Saya mengalami situasi di mana saya harus mengganti tag HTML dengan dua hasil penggantian yang berbeda.

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

hasil

"Alat Penyiram dan Pemasang Proteksi Kebakaran", "Steamfitter", "Terrazzo, Tile and Marble Setter",

Tempteh
sumber
0

Saya kira Anda sedang menjaga ini:

// 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);
}
Erald Karakashi
sumber
0

Dalam kasus penggunaan saya, saya membuat parameterisasi beberapa bidang dalam dokumen HTML, dan setelah saya memuat bidang ini, saya mencocokkan dan menggantinya menggunakan metode str_replace.

<?php echo str_replace(array("{{client_name}}", "{{client_testing}}"), array('client_company_name', 'test'), 'html_document'); ?>
tampilan data
sumber