Menu

substr() trong PHP: cắt lấy một phần của chuỗi

substr($string, $offset, $length) trả về một phần của chuỗi. Tìm hiểu offset âm, cách lấy các ký tự đầu hoặc cuối, mb_substr cho tiếng Việt, tiếng Nhật và văn bản UTF-8 khác, substr_count, và cách rút gọn văn bản kèm dấu ba chấm.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

substr($string, $offset, $length) trả về phần của $string bắt đầu tại vị trí $offset (đếm từ 0) và dài $length ký tự. substr('Hello world', 0, 5) trả về "Hello". Bỏ $length đi để lấy mọi thứ cho đến cuối chuỗi.

substr() đếm theo byte. Với văn bản tiếng Anh, byte cũng là ký tự, nhưng với tiếng Việt có dấu, tiếng Nhật, tiếng Trung hay emoji thì không. Với những văn bản đó, hãy dùng mb_substr(), được trình bày ở phía dưới.

Cú pháp

substr(string $string, int $offset, ?int $length = null): string
  • $offset là vị trí bắt đầu. 0 là ký tự đầu tiên. Giá trị âm được đếm từ cuối chuỗi.
  • $length là số byte cần lấy (trong văn bản ASCII thuần, một byte là một ký tự). Giá trị âm chừa lại chừng ấy ký tự ở cuối. null (hoặc bỏ trống) nghĩa là "đến hết chuỗi".

Offset và length âm: làm việc từ cuối chuỗi

$offset âm bắt đầu đếm từ cuối chuỗi, nên -1 là ký tự cuối cùng. $length âm dừng lại trước cuối chuỗi chừng ấy ký tự.

substr($s, 0, -1) là cách thường dùng để xóa ký tự cuối cùng, ví dụ dấu phẩy thừa do vòng lặp để lại.

Lấy ký tự đầu tiên hoặc cuối cùng

Để lấy một byte, bạn cũng có thể truy cập chuỗi trực tiếp theo chỉ số. $s[0] là ký tự đầu tiên và, từ PHP 7.1, $s[-1] là ký tự cuối cùng.

Truy cập một vị trí không tồn tại sẽ in ra cảnh báo, còn substr() chỉ trả về chuỗi rỗng. Nếu chuỗi có thể rỗng, hãy ưu tiên substr().

Ngoài phạm vi: chuỗi rỗng, không phải false

Nếu $offset nằm sau cuối chuỗi, substr() trả về "" trong PHP 8. Trong PHP 7 hàm này trả về false, nên code cũ kiểm tra === false không còn chạy đúng nữa.

Văn bản tiếng Nhật: dùng mb_substr

UTF-8 lưu mỗi chữ kana và kanji thông dụng bằng 3 byte (kanji hiếm như 𠮷 và emoji chiếm 4 byte). substr() đếm byte, nên substr('こんにちは', 0, 3) chỉ trả về こ, và một độ dài không rơi đúng ranh giới ký tự sẽ cắt đôi ký tự, tạo ra văn bản bị lỗi. mb_substr() nhận cùng các đối số và đếm theo ký tự.

Điều này cũng đúng với emoji và chữ có dấu như é hay chữ tiếng Việt. Để đếm số ký tự, dùng mb_strlen(); xem strlen() để hiểu rõ byte và ký tự.

Rút gọn văn bản kèm dấu ba chấm

Cắt bớt một tiêu đề dài để hiển thị trong danh sách hoặc thẻ là cách dùng substr() phổ biến nhất trong thực tế. Dùng mb_substr() để tiêu đề tiếng Nhật hay tiếng Việt không bao giờ bị cắt giữa ký tự, và chỉ thêm ... khi bạn thật sự đã rút gọn.

mb_strimwidth($text, 0, $width, '...') làm điều tương tự theo độ rộng hiển thị, trong đó một ký tự tiếng Nhật toàn khổ tính là 2 cột còn một chữ Latin tính là 1. Hàm này hợp với bố cục có độ rộng cố định.

Đếm chuỗi con với substr_count

substr_count($haystack, $needle) trả về số lần $needle xuất hiện. Hàm này phân biệt hoa thường và không đếm các kết quả khớp chồng lên nhau.

Kết hợp substr với strpos: lấy văn bản trước hoặc sau một ký tự

Kết hợp substr() với strpos() để cắt tại một ký tự mà bạn không biết trước vị trí, ví dụ dấu @ trong địa chỉ email:

Hãy kiểm tra strpos() không trả về false trước khi dùng kết quả: nếu không có ký tự đó, false được coi là 0 mà không có cảnh báo nào, nên substr('nobody', 0, $at) trả về "" còn substr('nobody', $at + 1) trả về "obody".

Câu hỏi thường gặp

Làm sao để lấy các ký tự cuối của chuỗi trong PHP?

Dùng offset âm: substr($s, -3) trả về 3 ký tự cuối. Với văn bản có thể chứa tiếng Việt có dấu, tiếng Nhật hoặc ký tự nhiều byte khác, hãy dùng mb_substr($s, -3).

substr và mb_substr khác nhau thế nào?

substr() đếm theo byte, còn mb_substr() đếm theo ký tự. Trong UTF-8, mỗi chữ kana và kanji thông dụng chiếm 3 byte, nên substr('日本語', 0, 2) cắt đôi một ký tự, trong khi mb_substr('日本語', 0, 2) trả về "日本".

substr trả về gì nếu vị trí bắt đầu nằm sau cuối chuỗi?

Một chuỗi rỗng. Từ PHP 8.0, substr('abc', 5) trả về ""; PHP 7 trả về false.

Làm sao để xóa ký tự cuối cùng của chuỗi trong PHP?

substr($s, 0, -1) trả về mọi thứ trừ byte cuối cùng. Dùng mb_substr($s, 0, -1) cho văn bản nhiều byte, hoặc rtrim($s, ',') nếu bạn chỉ muốn xóa một ký tự cụ thể ở cuối.

Làm sao để đếm số lần một chuỗi con xuất hiện trong PHP?

substr_count($haystack, $needle): substr_count('banana', 'an') trả về 2. Hàm này phân biệt hoa thường và không đếm các kết quả khớp chồng lên nhau.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu