str_contains($haystack, $needle) trả về true nếu $needle xuất hiện ở bất kỳ đâu trong $haystack, ngược lại trả về false. Hàm này có từ PHP 8.0 và phân biệt chữ hoa chữ thường.
Khác với strpos(), hàm này trả về một giá trị boolean thật sự, nên không có cái bẫy "tìm thấy ở vị trí 0 trông giống như false".
Cú pháp
str_contains(string $haystack, string $needle): bool
str_starts_with(string $haystack, string $needle): bool
str_ends_with(string $haystack, string $needle): bool
Cả ba hàm đều được thêm vào từ PHP 8.0 và làm việc theo từng byte, nên chúng xử lý đúng tiếng Việt, tiếng Nhật và văn bản UTF-8 khác mà không cần phiên bản mb_.
Kiểm tra phần đầu hoặc phần cuối với str_starts_with và str_ends_with
Kiểm tra chứa chuỗi không phân biệt hoa thường
Không có hàm str_icontains(). Hãy chuyển cả hai chuỗi sang chữ thường trước. mb_strtolower() còn chuyển được cả các chữ cái ngoài bảng ASCII, như É, chữ có dấu tiếng Việt hay chữ Kirin, những chữ mà strtolower() bỏ qua.
Chuỗi cần tìm rỗng trả về true
Một chuỗi cần tìm rỗng được tìm thấy trong mọi chuỗi, kể cả chuỗi rỗng. Điều này quan trọng khi chuỗi cần tìm đến từ một ô tìm kiếm mà người dùng để trống.
Kiểm tra chuỗi có chứa một hay tất cả trong nhiều từ
str_contains() chỉ nhận một chuỗi cần tìm. Hãy duyệt qua một mảng các chuỗi cần tìm: trả về ngay khi có một từ khớp với trường hợp "một trong số", hoặc ngay khi có một từ không khớp với trường hợp "tất cả".
Để kiểm tra một giá trị có phải là một phần tử của mảng hay không, thay vì là chuỗi con của một chuỗi, hãy dùng in_array().
Trước PHP 8: strpos !== false
Code phải chạy trên PHP 7 dùng strpos() với phép so sánh chặt. Kết quả giống hệt str_contains(), trừ trường hợp chuỗi cần tìm rỗng: strpos() của PHP 7 in ra Warning: strpos(): Empty needle và trả về false.
Dòng cuối in ra bool(false) dù đoạn văn bản có ở đó, vì php nằm ở vị trí 0. Thay những phép kiểm tra như vậy bằng str_contains() là một trong những nâng cấp lên PHP 8 dễ nhất.
Câu hỏi thường gặp
Làm sao kiểm tra một chuỗi có chứa một từ trong PHP?
Trên PHP 8, dùng str_contains($haystack, $needle), hàm trả về true hoặc false: str_contains('Hello world', 'world') là true. Trên PHP 7, dùng strpos($haystack, $needle) !== false.
str_contains có phân biệt chữ hoa chữ thường không?
Có. Để kiểm tra không phân biệt hoa thường, hãy chuyển cả hai vế sang chữ thường: str_contains(mb_strtolower($haystack), mb_strtolower($needle)), hoặc dùng stripos($haystack, $needle) !== false.
Vì sao str_contains trả về true với chuỗi rỗng?
Mọi chuỗi đều chứa chuỗi rỗng, nên str_contains('abc', '') trả về true. Nếu chuỗi cần tìm đến từ dữ liệu người dùng nhập, hãy kiểm tra nó không rỗng trước.
Làm sao kiểm tra một chuỗi bắt đầu hoặc kết thúc bằng thứ gì đó trong PHP?
Dùng str_starts_with($s, 'http') và str_ends_with($s, '.pdf'), cả hai được thêm vào từ PHP 8.0. Giống str_contains(), chúng phân biệt hoa thường và trả về một giá trị bool.