升級至 PHP 5.3 後,許多開發者會遇到 Function ereg() is deprecated 錯誤訊息。這是因為 PHP 核心團隊計畫在 PHP 6 中移除 POSIX 風格的正則表達式函數(如 ereg()、eregi()),改以 Perl 相容正則表達式(PCRE)函數 preg_match() 取而代之。
在函數前加上 @ 抑制錯誤訊息:
@ereg($pattern, $string);
這僅能隱藏警告,無法解決根本相容性問題,且未來版本將完全移除此函數。
核心差異在於 PCRE 要求正則模式必須包裹在分隔符號中(通常為正斜線 /)。
| POSIX (舊) | PCRE (新) |
|---|---|
ereg("^[0-9]*$", $page) | preg_match("/^[0-9]*$/", $page) |
eregi("pattern", $str) | preg_match("/pattern/i", $str) (i 修飾符表不區分大小寫) |
<?php
// 改寫前 (PHP 5.2 及之前)
function inject_check($sql_str) {
$sql_str = strtolower($sql_str);
return eregi('fopen|post|eval|select|insert|and|or|update|delete|\'|/\*|\*|\.\./|\./|union|into|load_file|outfile', $sql_str);
}
// 改寫後 (PHP 5.3+ 相容)
function inject_check($sql_str) {
$sql_str = strtolower($sql_str);
// 注意:模式前後必須加上 / 分隔符,特殊字元需轉義
return preg_match('/fopen|post|eval|select|insert|and|or|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/i', $sql_str);
}
?>
preg_match 的第一個參數必須是 /pattern/ 格式。.、*、/)在 PCRE 中需加反斜線轉義。/pattern/i,而非 eregi。專案較大時,可使用 IDE 的全域搜尋取代功能,搭配正則表達式批次轉換:
ereg\((["'])(.+?)\1\s*,\s*(\$\w+)\)preg_match("/\2/", \3) (需人工檢查轉義與修飾符)完成遷移後,程式碼將相容 PHP 5.3 至最新版本(PHP 8.x),並獲得更佳效能與功能支援。