BizMaC bizmac.com

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
  1. Tìm hết các chỗ gọi hàm cũ trong mã nguồn.
  2. Đổi tên hàm sang họ preg tương ứng.
  3. Bọc mẫu tìm kiếm trong dấu phân cách.
  4. 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.

Hướng dẫn này có giúp được Anh/Chị không?

Bài khác trong Web Hosting

Xem cả 14 bài
Kích hoạt LiteSpeed Cache tăng tốc website Cách bật LiteSpeed Cache cho WordPress, Joomla, PrestaShop và mã nguồn PHP tự viết, kèm cách đọc HTTP header để xác nhận cache đã chạy đúng. 9 phút đọc 114 lượt xem Cập nhật 24/08/2026 Managed vs unmanaged hosting: chọn loại nào Managed hosting và unmanaged hosting khác nhau ở chỗ ai vận hành máy chủ. Bài này so từng đầu việc, chi phí thật và cách chọn theo tình huống của bạn. 9 phút đọc 111 lượt xem Cập nhật 09/08/2026 Vì sao website báo lỗi 403, 404, 500 và cách xử Lỗi 403 là bị chặn quyền, 404 là không tìm thấy trang, 500 là lỗi máy chủ. Bài này giải thích mỗi mã lỗi website nghĩa là gì và thử cách xử nào trước. 7 phút đọc 9 lượt xem Cập nhật 29/07/2026 Băng thông và dung lượng hosting là gì Băng thông là lượng dữ liệu truyền ra mỗi tháng, dung lượng là chỗ chứa file. Bài này phân biệt hai thứ hay bị nhầm và cách ước lượng mình cần bao nhiêu. 6 phút đọc 12 lượt xem Cập nhật 29/07/2026 Chuyển website sang hosting BizMaC cần làm gì Chuyển website sang hosting BizMaC theo ba bước: sao lưu ở nơi cũ, đưa dữ liệu lên hosting mới rồi trỏ tên miền sau cùng. Bài này là bản đồ tổng quát cả quy trình. 6 phút đọc 9 lượt xem Cập nhật 28/07/2026 Public_html là gì và đặt file website vào đâu Public_html là thư mục gốc của website trên hosting. Bài này giải thích tên thư mục gốc trên mỗi bảng điều khiển và cách đặt file website vào đúng chỗ. 5 phút đọc 11 lượt xem Cập nhật 28/07/2026

Là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ị.

Gửi yêu cầu hỗ trợ