Menu

trim() trong PHP: xóa khoảng trắng ở hai đầu chuỗi

trim($string) xóa khoảng trắng, tab và ký tự xuống dòng ở cả hai đầu chuỗi; ltrim() và rtrim() làm sạch một phía. Tìm hiểu cách xóa các ký tự cụ thể, khoảng trắng toàn khổ của tiếng Nhật và trim mọi giá trị trong mảng.

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.

trim($string) trả về chuỗi đã được xóa khoảng trắng ở đầu và cuối: dấu cách, tab, xuống dòng, về đầu dòng, byte NUL và tab dọc. ltrim() chỉ xóa ở đầu chuỗi và rtrim() chỉ xóa ở cuối. Khoảng trắng ở giữa được giữ nguyên.

Kết quả của var_dump() cho thấy độ dài của từng kết quả, nhờ đó bạn thấy được các ký tự đã bị xóa. Trim là việc đầu tiên nên làm với phần lớn giá trị lấy từ form (mật khẩu là ngoại lệ, xem cuối trang): người dùng gõ ada@example.com có dấu cách ở cuối vẫn phải đăng nhập được.

Cú pháp

trim(string $string, string $characters = " \n\r\t\v\0"): string
ltrim(string $string, string $characters = " \n\r\t\v\0"): string
rtrim(string $string, string $characters = " \n\r\t\v\0"): string

trim() trả về một chuỗi mới; hàm này không thay đổi biến bạn truyền vào.

Trim các ký tự cụ thể

Đối số thứ hai thay thế danh sách mặc định. Mọi ký tự trong đó đều bị xóa khỏi hai đầu, theo bất kỳ thứ tự nào và bao nhiêu lần cũng được. .. định nghĩa một khoảng, nên 'a..z' nghĩa là mọi chữ cái thường.

Để vẫn xóa cả khoảng trắng thông thường, hãy thêm chúng vào danh sách: trim($s, " \n\r\t\v\0/").

Đối số thứ hai là một tập ký tự, không phải một chuỗi

trim() không xóa một từ hay một hậu tố. Hàm này xóa bất kỳ ký tự nào bạn liệt kê, từ cả hai đầu, cho đến khi gặp một ký tự không có trong danh sách. Điều này làm nhiều người bất ngờ khi họ thử bỏ phần mở rộng của tệp:

Dòng đầu tiên xóa luôn cả chữ h ở đầu, vì h nằm trong tập ký tự. Để xóa một tiền tố hoặc hậu tố cố định, hãy dùng str_starts_with() hoặc str_ends_with() cùng với substr(), hoặc str_replace() nếu đoạn văn bản đó không thể xuất hiện ở chỗ nào khác.

Trim khoảng trắng toàn khổ (dữ liệu nhập tiếng Nhật)

Bàn phím tiếng Nhật thường tạo ra khoảng trắng ideographic   (U+3000), chẳng hạn quanh một cái tên gõ vào form. Ký tự này không có trong danh sách mặc định của trim, và liệt kê nó ở đối số thứ hai là một cái bẫy: trim() xử lý từng byte, khoảng trắng này gồm 3 byte E3 80 80, mà E3 cũng là byte đầu tiên của mọi chữ hiragana và katakana, nên một cái tên bắt đầu bằng những chữ đó sẽ mất byte đầu tiên của ký tự. Hãy dùng biểu thức chính quy (regular expression) với modifier u:

\A và \z neo vào đầu và cuối chuỗi. Với modifier u, \s khớp với mọi khoảng trắng Unicode: khoảng trắng ASCII, khoảng trắng toàn khổ và khoảng trắng không ngắt dòng (U+00A0) mà việc sao chép từ trang web thường mang theo. Không có u, \s chỉ khớp khoảng trắng ASCII và khoảng trắng toàn khổ vẫn còn đó. PHP 8.4 thêm mb_trim(), mb_ltrim() và mb_rtrim() cho việc này; trên PHP 8.3 trở về trước, biểu thức chính quy là cách để làm.

Trim mọi giá trị trong mảng

array_map('trim', $array) trim từng giá trị và giữ nguyên khóa. Một trường hợp điển hình là danh sách cách nhau bởi dấu phẩy từ một ô nhập liệu, được tách bằng explode():

Trim giá trị của form trước khi kiểm tra

Trim trước, rồi mới kiểm tra chuỗi rỗng. Khi đó, một ô chỉ chứa khoảng trắng sẽ bị từ chối vì rỗng. Chạy khối này, gõ một cái tên có khoảng trắng ở hai bên vào form rồi bấm Send: cùng script đó sẽ chạy lại với $_POST đã có dữ liệu.

Đừng trim mật khẩu: một dấu cách ở cuối mật khẩu cũng là một phần của mật khẩu.

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

trim() trong PHP xóa những gì?

Mặc định, ở cả hai đầu chuỗi: khoảng trắng, tab (\t), xuống dòng (\n), về đầu dòng (\r), byte NUL (\0) và tab dọc (\v). Hàm này không bao giờ đụng tới phần giữa chuỗi.

trim, ltrim và rtrim khác nhau thế nào?

trim() làm sạch cả hai đầu, ltrim() chỉ phần đầu và rtrim() chỉ phần cuối. Cả ba đều nhận cùng một danh sách tùy chọn gồm các ký tự cần xóa.

Vì sao trim() không xóa được khoảng trắng toàn khổ của tiếng Nhật?

Khoảng trắng toàn khổ (U+3000) không nằm trong danh sách mặc định của trim và chiếm 3 byte trong UTF-8. Hãy dùng preg_replace('/\A\s+|\s+\z/u', '', $s): với modifier u, \s khớp với mọi khoảng trắng Unicode, kể cả U+3000. PHP 8.4 thêm mb_trim(), hàm này cũng xóa được nó.

Làm sao để xóa dấu phẩy cuối cùng của chuỗi trong PHP?

rtrim($s, ',') xóa mọi dấu phẩy ở cuối. Nếu có thể có khoảng trắng theo sau, hãy thêm cả khoảng trắng: rtrim($s, ', ').

Làm sao để trim mọi giá trị trong một mảng?

array_map('trim', $array) trả về một mảng mới với mọi giá trị đã được trim, giữ nguyên khóa. Với mảng lồng nhau, hãy dùng array_walk_recursive() với tham chiếu.

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