str_replace($search, $replace, $subject) trả về một bản sao của $subject trong đó mọi lần xuất hiện của $search được thay bằng $replace. str_replace('world', 'PHP', 'Hello world') trả về "Hello PHP".
Hàm trả về chuỗi mới; nó không sửa biến bạn truyền vào. Hãy gán kết quả, kể cả gán lại cho chính biến đó: $text = str_replace(...).
Cú pháp
str_replace(
array|string $search,
array|string $replace,
string|array $subject,
int &$count = null
): string|array
Mỗi đối số trong ba đối số đầu có thể là chuỗi hoặc mảng. Nếu $subject là mảng, phép thay chạy trên từng phần tử và bạn nhận lại một mảng với cùng các khóa: str_replace('.txt', '.md', ['a.txt', 'b.txt']) trả về ['a.md', 'b.md']. Việc tìm kiếm phân biệt hoa thường và so khớp văn bản thuần, không phải mẫu. Với mẫu, hãy dùng preg_replace().
Thay nhiều chuỗi cùng lúc
Truyền mảng cho $search và $replace. Giá trị tìm thứ nhất được thay bằng giá trị thay thứ nhất, giá trị thứ hai bằng giá trị thứ hai, và cứ thế. Nếu $replace chỉ là một chuỗi, mọi giá trị tìm đều được thay bằng chuỗi đó, đây là cách ngắn gọn để xóa một nhóm ký tự.
Cái bẫy thứ tự và strtr()
Với mảng, str_replace() chạy lần lượt từng phép thay trên toàn bộ chuỗi. Một giá trị tìm phía sau có thể khớp với đoạn văn bản mà phép thay trước đó vừa chèn vào. strtr() với một mảng thay mọi thứ trong một lượt duy nhất, thử các khóa dài nhất trước, và không bao giờ đụng vào đoạn văn bản đã được thay.
Hãy dùng strtr() để hoán đổi giá trị và cho các chỗ giữ trong template mà có thể xuất hiện trong chính các giá trị.
Đếm số lần thay
Đối số thứ tư được điền số lần thay đã thực hiện. Truyền vào một biến; PHP sẽ ghi vào đó.
Thay không phân biệt hoa thường với str_ireplace
str_ireplace() nhận cùng các đối số và bỏ qua hoa thường khi so khớp. Chuỗi thay được chèn vào đúng như bạn đã viết.
str_ireplace() chỉ xử lý hoa thường cho chữ cái ASCII. Để thay không phân biệt hoa thường với chữ có dấu (như tiếng Việt) hay chữ Kirin, hãy dùng preg_replace() với các modifier i và u.
Chỉ thay lần xuất hiện đầu tiên
str_replace() luôn thay tất cả. Để chỉ thay phần khớp đầu tiên, tìm nó bằng strpos() rồi cắt ra bằng substr_replace():
Với lần xuất hiện cuối cùng, dùng strrpos() thay cho strpos().
Xóa khoảng trắng, dấu xuống dòng và các ký tự khác
Thay bằng một chuỗi rỗng là xóa đoạn văn bản đó. Một bước làm sạch phổ biến là xóa dấu xuống dòng hoặc mọi khoảng trắng, và dữ liệu nhập bằng tiếng Nhật thường chứa khoảng trắng toàn độ rộng ( , U+3000) mà một phép tìm " " thông thường không khớp được.
Đặt "\r\n" trước "\n" và "\r" trong mảng, để một dấu xuống dòng kiểu Windows trở thành một khoảng trắng chứ không phải hai.
Câu hỏi thường gặp
Làm sao thay thế văn bản trong một chuỗi PHP?
Dùng str_replace($search, $replace, $subject): str_replace('cat', 'dog', 'cat and cat') trả về "dog and dog". Hàm thay mọi lần xuất hiện và trả về một chuỗi mới; chuỗi gốc không bị thay đổi.
str_replace có phân biệt chữ hoa chữ thường không?
Có. str_replace('php', 'PHP', 'Php') không thay đổi gì. Hãy dùng str_ireplace(), hàm nhận cùng các đối số và bỏ qua hoa thường.
Làm sao chỉ thay lần xuất hiện đầu tiên trong PHP?
str_replace() không có đối số giới hạn. Tìm vị trí bằng strpos() rồi dùng substr_replace($s, $replace, $pos, strlen($search)), hoặc dùng preg_replace('/' . preg_quote($search, '/') . '/', $replace, $s, 1).
Làm sao thay nhiều chuỗi cùng lúc trong PHP?
Truyền vào các mảng: str_replace(['a', 'b'], ['1', '2'], $s). Các phép thay chạy theo thứ tự, nên một giá trị tìm phía sau có thể khớp với đoạn văn bản mà phép thay trước vừa chèn vào. strtr($s, ['a' => '1', 'b' => '2']) thay mọi thứ trong một lượt và không bao giờ thay lại.
str_replace có dùng được với tiếng Việt, tiếng Nhật hay văn bản UTF-8 khác không?
Có. str_replace() so khớp theo byte, và một ký tự UTF-8 hoàn chỉnh không bao giờ khớp nằm bên trong một ký tự khác, nên str_replace('東京', '大阪', $s) là an toàn. Không cần phiên bản mb_.