首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP POSIX 正則函數庫 (ereg 系列) 詳細說明與遷移指南

     編輯:PHP 綜合知識

⚠️ 重要提示:已棄用並移除

PHP 5.3.0 起棄用,PHP 7.0.0 完全移除 `ereg`、`eregi`、`ereg_replace`、`eregi_replace`、`split`、`spliti` 等 POSIX 正則函數。**現代專案請直接使用 PCRE 函數 (`preg_*`)**。

本文僅供維護舊版 PHP (≤5.6) 專案參考,或理解歷史代碼遷移。

POSIX 正則 vs PCRE 差異速查

特性POSIX (ereg)PCRE (preg)
定界符無 (字串本身即模式)必要 (如 `/pattern/i`)
大小寫分函數 `ereg`/`eregi`修飾符 `i`
貪婪/非貪婪不支援非貪婪 `*?`支援 `*?`, `+?`, `??`
前瞻/後顧不支援支援 `(?=...)`, `(?!...)`, `(?<=...)`
子模式捕獲支援 `()` 但無命名群組支援 `(?P...)`
二進位安全**不安全** (視為字串終止)**安全** (支援 `\0`)
效能較慢優化極好 (JIT 可用)

常用函數對照表

POSIX 函數PCRE 替代範例
ereg(pattern, str)preg_match('/pattern/', str)`preg_match('/^abc$/', $str)`
eregi(pattern, str)preg_match('/pattern/i', str)`preg_match('/abc/i', $str)`
ereg_replace(pattern, repl, str)preg_replace('/pattern/', repl, str)`preg_replace('/\s+/', '-', $str)`
eregi_replace(pattern, repl, str)preg_replace('/pattern/i', repl, str)`preg_replace('/abc/i', 'X', $str)`
split(pattern, str)preg_split('/pattern/', str)`preg_split('/\s*,\s*/', $csv)`
spliti(pattern, str)preg_split('/pattern/i', str)`preg_split('/\s+/i', $str)`

遷移實戰範例

<?php
// 舊代碼
if (eregi('(mozilla.[23]|MSIE.3)', $_SERVER['HTTP_USER_AGENT'])) { ... }
$parts = split('[:,]', 'a:b,c:d');
$str = ereg_replace('\n', '
', $str); // 遷移後 if (preg_match('/(mozilla.[23]|MSIE.3)/i', $_SERVER['HTTP_USER_AGENT'])) { ... } $parts = preg_split('/[:,]/', 'a:b,c:d'); $str = preg_replace('/\n/', '
', $str); ?>

自動遷移工具

  • Rector:`composer require rector/rector --dev` → `vendor/bin/rector process src --set php70` 自動將 `ereg*` 轉 `preg_*`。
  • PHP_CodeSniffer + PHP-CS-Fixer:規則 `ereg_to_preg` 可自動修正。
  • 手動 grep:`grep -rn "ereg\|split" src/` 逐一檢查邊界情況 (如模式含 `/` 需轉義)。

常見遷移陷阱

  1. 模式中的正斜線 `/`:POSIX 無定界符,`ereg('/path/', $str)` → PCRE 需換定界符 `preg_match('#/path/#', $str)` 或轉義 `preg_match('/\/path\//', $str)`。
  2. 中文字元**:POSIX 視字串為單字節,`ereg('中文', $str)` 在 UTF-8 下錯誤;PCRE 需加 `u` 修飾符 `preg_match('/中文/u', $str)`。
  3. split 空字串分割**:`split(':', 'a::b')` 返回 `['a', '', 'b']`;`preg_split('/:/', 'a::b')` 預設同,但 `PREG_SPLIT_NO_EMPTY` 可過濾空值。
  4. 大小寫不敏感**:`eregi` → `preg_match('/pattern/i')`,注意 `i` 修飾符位置。

結論

所有新專案**強制使用 PCRE (`preg_*`)**。舊專案若仍運行於 PHP 5.6 以下,規劃升級路徑:PHP 5.6 → 7.4 → 8.2,並同步以 Rector 批次遷移正則函數,一次到位,避免技術債累積。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved