PHP 5.3.0 起棄用,PHP 7.0.0 完全移除 `ereg`、`eregi`、`ereg_replace`、`eregi_replace`、`split`、`spliti` 等 POSIX 正則函數。**現代專案請直接使用 PCRE 函數 (`preg_*`)**。
本文僅供維護舊版 PHP (≤5.6) 專案參考,或理解歷史代碼遷移。
| 特性 | 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);
?>
所有新專案**強制使用 PCRE (`preg_*`)**。舊專案若仍運行於 PHP 5.6 以下,規劃升級路徑:PHP 5.6 → 7.4 → 8.2,並同步以 Rector 批次遷移正則函數,一次到位,避免技術債累積。