Fix lỗi Function ereg is deprecated cho PHP 5.3
Hướng dẫn Web Hosting · cập nhật 16/08/2026
Để sửa lỗi Function ereg() is deprecated, bạn thay hàm ereg bằng preg_match và bọc mẫu tìm kiếm trong hai dấu gạch chéo. Mỗi chỗ gọi hàm sửa mất chưa tới một phút, khó nhất là tìm hết các chỗ gọi trong mã nguồn.
Thông báo hiện ra trên trang web hoặc trong file log:
Deprecated: Function ereg() is deprecated in /home/user/domains/example.com/public_html/upload.php on line 366
- Tìm hết các chỗ gọi hàm cũ trong mã nguồn.
- Đổi tên hàm sang họ preg tương ứng.
- Bọc mẫu tìm kiếm trong dấu phân cách.
- Chạy thử từng chức năng có dùng hàm vừa sửa.
PHP 5.3 hết hỗ trợ từ 14/08/2014 và hàm ereg bị gỡ hẳn khỏi PHP từ bản 7.0 phát hành tháng 12/2015. Trên PHP 7 trở lên, mã cũ không còn báo Deprecated mà báo thẳng Call to undefined function. Bài này giữ cho mã nguồn cũ đang cần chuyển sang bản PHP mới.
Vì sao PHP báo Function ereg is deprecated
PHP từng có hai bộ hàm xử lý biểu thức chính quy: họ ereg theo chuẩn POSIX và họ preg theo chuẩn PCRE. Từ bản 5.3, nhóm phát triển PHP đánh dấu họ hàm POSIX là lỗi thời vì chậm hơn và thiếu nhiều tính năng, rồi gỡ hẳn ở bản 7.0. Thông báo Deprecated là lời báo trước, không phải lỗi làm dừng mã.
Trang vẫn chạy được với thông báo này, nhưng dòng chữ đó in thẳng ra HTML và làm hỏng giao diện, hoặc phá vỡ phần đầu của file khi mã nguồn có gửi header. Nghiêm trọng hơn: nâng lên PHP 7 là toàn bộ chỗ gọi ereg đứt hẳn.
Bảng đối chiếu hàm ereg sang hàm preg tương ứng
Năm hàm trong họ ereg đều có hàm tương ứng bên họ preg. Điểm khác quan trọng nhất là preg đòi mẫu tìm kiếm phải nằm giữa hai ký tự phân cách, thường là dấu gạch chéo. Quên bọc mẫu là lỗi hay gặp nhất khi chuyển đổi.
| Hàm cũ | Hàm thay thế | Điểm phải sửa thêm |
|---|---|---|
ereg() | preg_match() | Bọc mẫu trong hai dấu gạch chéo |
eregi() | preg_match() | Bọc mẫu và thêm cờ i ở cuối |
ereg_replace() | preg_replace() | Bọc mẫu trong hai dấu gạch chéo |
eregi_replace() | preg_replace() | Bọc mẫu và thêm cờ i ở cuối |
split() | preg_split() | Bọc mẫu, hoặc dùng explode nếu tách theo chuỗi cố định |
Thứ tự tham số của hai họ hàm giống nhau: mẫu đứng trước, chuỗi cần xử lý đứng sau, biến nhận kết quả đứng thứ ba. Nhờ vậy phần lớn trường hợp chỉ cần đổi tên hàm và thêm dấu phân cách, không phải viết lại logic.
Cách thay ereg bằng preg_match để hết lỗi deprecated
Ba ví dụ dưới đây lấy từ các thư viện upload file cũ, nơi hàm cũ hay được dùng để tách phần mở rộng và làm sạch tên file. Mỗi ví dụ cho thấy một dạng chuyển đổi khác nhau, đủ để bạn suy ra cách sửa cho phần còn lại của mã.
1. Đổi ereg sang preg_match
Mã cũ:
ereg('.([^.]*$)', $this->file_src_name, $extension);
Sửa thành:
preg_match('/.([^.]*$)/', $this->file_src_name, $extension);
Mẫu tìm kiếm được bọc thêm hai dấu gạch chéo ở đầu và cuối. Đây là ký tự phân cách của họ preg, dùng để tách phần mẫu khỏi phần cờ đứng sau nó.
2. Đổi ereg_replace sang preg_replace
Mã cũ:
$this->file_dst_name_body = ereg_replace('[^A-Za-z0-9_]', '', $this->file_dst_name_body);
Sửa thành:
$this->file_dst_name_body = preg_replace('/[^A-Za-z0-9_]/', '', $this->file_dst_name_body);
3. Đổi eregi sang preg_match kèm cờ i
Hàm eregi là bản không phân biệt chữ hoa chữ thường của ereg. Bên họ preg không có hàm riêng cho việc này, thay vào đó thêm chữ i ngay sau dấu phân cách đóng.
Mã cũ:
eregi('.([^.]*$)', $this->file_src_name, $extension);
Sửa thành:
preg_match('/.([^.]*$)/i', $this->file_src_name, $extension);
Chọn dấu phân cách khi mẫu có chứa dấu gạch chéo
Dấu gạch chéo là lựa chọn quen thuộc nhưng không bắt buộc. Khi mẫu tìm kiếm chứa sẵn dấu gạch chéo, chẳng hạn khi so khớp một địa chỉ URL, dùng dấu đó làm phân cách buộc bạn phải thoát từng ký tự một và mẫu trở nên khó đọc.
Mẫu khớp URL nếu dùng dấu gạch chéo làm phân cách:
preg_match('/http:\/\/example\.com\/duong\-dan/', $url);
Cùng mẫu đó nhưng đổi phân cách sang dấu thăng, dễ đọc hơn hẳn:
preg_match('#http://example\.com/duong-dan#', $url);
PHP chấp nhận hầu hết ký tự không phải chữ cái, chữ số hay khoảng trắng làm phân cách. Hai lựa chọn dùng nhiều nhất là dấu thăng và dấu ngã. Chọn ký tự nào không xuất hiện trong mẫu là được.
Cách tìm hết chỗ gọi hàm lỗi thời trong mã nguồn
Thông báo lỗi chỉ ra một dòng, nhưng mã nguồn cũ thường gọi hàm này ở nhiều chỗ và các chỗ còn lại chỉ lộ ra khi người dùng chạm đúng chức năng đó. Quét toàn bộ mã nguồn một lượt tiết kiệm hơn nhiều so với sửa từng lỗi hiện ra.
grep -rn "ereg\|eregi\|ereg_replace\|eregi_replace\|split(" /home/user/domains/example.com/public_html --include="*.php"
Lệnh in ra đường dẫn file kèm số dòng cho mọi chỗ gọi. Chú ý kết quả của split( vì tên này trùng với nhiều hàm tự viết trong mã nguồn, kiểm từng dòng trước khi sửa.
Nếu máy chủ dùng bảng điều khiển, bạn chạy lệnh trên qua SSH với quyền của chính tài khoản chứa website, không cần quyền root. Bạn cũng đổi được bản PHP cho từng website trong bảng điều khiển để thử mã trên bản mới trước khi chuyển hẳn, xem cách làm ở hướng dẫn bật tắt extension PHP trên DirectAdmin.
Kiểm lại sau khi sửa xong
Sau khi thay hết các chỗ gọi, chạy lại từng chức năng có dùng biểu thức chính quy: tải file lên, tìm kiếm, lọc dữ liệu biểu mẫu. Lỗi biểu thức chính quy không làm dừng mã mà trả về kết quả rỗng, nên nhìn màn hình không đủ, phải thử với dữ liệu thật.
Bật hiện lỗi tạm thời trên máy phát triển để bắt cảnh báo còn sót:
error_reporting(E_ALL);
ini_set('display_errors', 1);
Trên máy chủ đang phục vụ thì làm ngược lại: tắt hiện lỗi ra trang và ghi vào file log. Người dùng không nên thấy đường dẫn thư mục trên máy chủ, mà thông báo Deprecated in ra trang lại lộ đúng thứ đó. Một số hàm PHP còn bị chặn hẳn trên máy chủ chia sẻ, xem vì sao phải hạn chế thực thi một số hàm PHP.
Bước tiếp theo sau khi bỏ hết hàm lỗi thời
Bỏ được họ hàm cũ là điều kiện cần để mã nguồn chạy trên PHP 7 trở lên, nhưng chưa đủ. Bản 7.0 còn gỡ họ hàm mysql_ cũ, ép dùng mysqli hoặc PDO, và đổi cách xử lý một số cấu trúc. Quét tiếp hai nhóm đó trước khi đổi bản PHP cho website đang chạy.
Cách an toàn là tạo một bản sao website trên tên miền phụ, đặt bản PHP mới cho riêng bản sao đó, rồi chạy thử hết các chức năng. Xong xuôi mới đổi bản PHP cho website chính. Làm ngược lại thì lỗi lộ ra trước mắt người dùng thật.
Mã nguồn quá cũ và không còn ai bảo trì thì việc chuyển đổi có khi tốn hơn viết lại. Cân nhắc mốc này trước khi bắt tay: mã nguồn cần sửa trên năm mươi chỗ gọi hàm lỗi thời thường là dấu hiệu nên tính đường thay nền tảng.
Bài khác trong Web Hosting
Xem cả 14 bàiLàm theo vẫn chưa được?
Gửi yêu cầu hỗ trợ, kỹ thuật xem trực tiếp trên dịch vụ của Anh/Chị.