PHP 5.3.0 起棄用 POSIX 正則函數 (ereg、eregi 等),5.7.0 移除。必須遷移至 PCRE 函數 (preg_* 系列)。本文提供完整對照表與遷移技巧。
| POSIX 函數 (棄用) | PCRE 替代函數 | 關鍵差異 |
|---|---|---|
| ereg(pattern, str) | preg_match('/pattern/', str) | 需分隔符、支持修飾符 |
| eregi(pattern, str) | preg_match('/pattern/i', str) | i 修飾符替代大小寫不敏感 |
| ereg_replace(pattern, repl, str) | preg_replace('/pattern/', repl, str) | 同上 |
| eregi_replace(pattern, repl, str) | preg_replace('/pattern/i', repl, str) | 同上 |
| split(pattern, str) | preg_split('/pattern/', str) | 或用 explode() 非正則分割 |
| spliti(pattern, str) | preg_split('/pattern/i', str) | 同上 |
| sql_regcase(pattern) | 無直接替代 | 手動構建字符類 [aA] |
/ (或 #、~ 等)eregi → /pattern/i$、^、. 等在字符類中行為差異[:alnum:] → PCRE \w / [a-zA-Z0-9]<?php
// 1. 簡單匹配
// ereg('^test', $file)
if (preg_match('/^test/', $file)) { ... }
// 2. 大小寫不敏感
// eregi('^test', $file)
if (preg_match('/^test/i', $file)) { ... }
// 3. 替換
// ereg_replace('\.php$', '.html', $url)
$url = preg_replace('/\.php$/', '.html', $url);
// 4. 分割
// split(':', $str)
$parts = preg_split('/:/', $str);
// 非正則分割更快
$parts = explode(':', $str);
// 5. sql_regcase 手動替代
// sql_regcase('abc') → '[aA][bB][cC]'
function pcre_regcase($str) {
return preg_replace_callback('/./', function($m) {
$c = $m[0];
return '[' . strtolower($c) . strtoupper($c) . ']';
}, $str);
}
| POSIX 寫法 | 錯誤 PCRE | 正確 PCRE | 原因 |
|---|---|---|---|
| ereg('.', $str) | preg_match('/./', $str) | preg_match('/\./', $str) | . 需轉義匹配字面點 |
| ereg('[0-9]', $str) | preg_match('/[0-9]/', $str) | preg_match('/\d/', $str) | \d 更簡潔 |
| eregi('abc', $str) | preg_match('/abc/i', $str) | preg_match('/abc/i', $str) | 正確 |
| split('\|', $str) | preg_split('/|/', $str) | preg_split('/\|/', $str) | | 需轉義 |
preg_split 快 10 倍以上$pattern = '/.../',避免重複編譯<?php
// 簡單掃描項目文件
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator(__DIR__)
);
foreach ($files as $file) {
if ($file->isFile() && $file->getExtension() === 'php') {
$content = file_get_contents($file->getPathname());
// 檢測棄用函數
if (preg_match('/\b(ereg|eregi|split|spliti|sql_regcase)\b/', $content)) {
echo "需遷移: " . $file->getPathname() . "\n";
}
}
}
遷移清單:1) 全局搜索棄用函數 2) 按對照表替換 3) 重點測試正則邏輯 4) 性能基準對比 5) 更新 CI/CD 檢查規則禁止回歸。