Str_replace cho nhiều mặt hàng


115

Tôi nhớ đã làm điều này trước đây, nhưng không thể tìm thấy mã. Tôi sử dụng str_replace để thay thế một ký tự như thế này: str_replace(':', ' ', $string);nhưng tôi muốn thay thế tất cả các ký tự sau \/:*?"<>|mà không cần thực hiện str_replace cho mỗi ký tự.


2
bạn muốn thay thế tất cả các ký tự này bằng một khoảng trắng?
Book Of Zeus vào

7
Đừng ngại tham khảo hướng dẫn sử dụng php.net tuyệt vời và xem lại phần tham số để xem liệu những gì bạn muốn có khả thi hay không.
Mike B

Câu trả lời:


117

str_replace() có thể lấy một mảng, vì vậy bạn có thể làm:

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

Ngoài ra, bạn có thể sử dụng preg_replace():

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

2
Giả sử OP có nghĩa là dấu gạch chéo ngược phải được thay thế, mẫu preg_replace đó không hoạt động với tôi. Để dấu gạch chéo ngược hoạt động như mong đợi, tôi phải sử dụng 4 trong số chúng (tức là "\\\\") trong mẫu.
GreenMatt

1
Câu trả lời tốt, thêm câu trả lời @dogbert vào sẽ làm cho nó hoàn chỉnh cho những người không đọc hướng dẫn và không nhận ra str_split trả về một mảng.
Bradmage,

Lợi thế của str_replace()hơn preg_replace()(hoặc ngược lại) trong trường hợp của OP là gì?
ludditedev

1
@ludditedev Không có lợi thế thực sự theo cách nào cả, đó chỉ là vấn đề sở thích
NullUserException 23/02/19

1
@MadhurBhaiya Thay đổi regex thành '~[\\+><-]~'(lưu ý vị trí của -nó). Dấu gạch ngang ( -) là một siêu ký tự regex, vì vậy nó cần phải thoát hoặc được đặt một cách chiến lược trong lớp ký tự (mọi thứ bên trong []). Xem câu trả lời này: stackoverflow.com/a/7604888/396458
NullUserException

179

Như thế này:

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

Hoặc, trong PHP hiện đại (bất kỳ thứ gì từ 5.4 trở đi), ít từ hơn một chút:

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

73

Ví dụ: nếu bạn muốn thay thế search1 bằng Replace1 và search2 bằng Replace2 thì mã sau sẽ hoạt động:

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

// Đầu ra: Replace1 Replace2


48
str_replace(
    array("search","items"),
    array("replace", "items"),
    $string
);


2

Bạn có thể sử dụng preg_replace () . Ví dụ sau có thể được chạy bằng dòng lệnh php:

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

Đầu ra:

$ s2: "chuỗi"


Quá nhiều thoát bên trong lớp nhân vật. (xem câu trả lời được chấp nhận)
mickmackusa

0

Tôi đã gặp một tình huống trong đó tôi phải thay thế các thẻ HTML bằng hai kết quả thay thế khác nhau.

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

kết quả

"Sprinkler and Fire Protection Installer", "Steamfitter", "Terrazzo, Tile and Marble Setter",


0

Tôi đoán bạn đang tìm kiếm điều này:

// 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

Trong trường hợp sử dụng của mình, tôi đã tham số hóa một số trường trong tài liệu HTML và sau khi tải các trường này, tôi khớp và thay thế chúng bằng phương thức str_replace.

<?php echo str_replace(array("{{client_name}}", "{{client_testing}}"), array('client_company_name', 'test'), 'html_document'); ?>
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.