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

PHP 正則表達式完全指南:語法詳解、核心函數與實戰範例

     編輯:PHP 綜合知識

正則表達式是 PHP 中處理字串匹配、驗證、擷取、替換的利器。本文系統整理語法規則、核心函數與實戰範例,助你從入門到精通。

一、基礎語法元素

1. 定界符

模式必須包裹在定界符中,慣用 /,也可用 #、~ 等非字母數字字元:

/pattern/   # 正確
#pattern#   # 正確,適合包含 / 的模式 (如 URL)

2. 元字符:量詞

元字符 含義 範例匹配
+前導字元出現 1 次或多次/php+/ 匹配 "phpp"、"phppp"
*前導字元出現 0 次或多次/php*/ 匹配 "ph"、"php"、"phpp"
?前導字元出現 0 次或 1 次/php?/ 匹配 "ph"、"php"
{n}恰好 n 次/php{2}/ 匹配 "phpp"
{n,}至少 n 次/php{2,}/ 匹配 "phpp"、"phppp"...
{n,m}n 到 m 次/php{1,3}/ 匹配 "php"~"phppp"

3. 常用字元類別

符號 匹配範圍
\s空白字元 (空格、Tab、換行)
\S非空白字元
\d數字 0-9
\D非數字
\w字母、數字、底線 (等同 [a-zA-Z0-9_])
\W非單字字元
.除換行外任意字元

4. 定位符

符號 含義
^字串開頭 (多行模式下為行首)
$字串結尾 (多行模式下為行尾)
\b單字邊界 (開頭或結尾)
\B非單字邊界

5. 字元類別與範圍

/[A-Z]/      # 任一大寫字母
/[a-z]/      # 任一小寫字母
/[0-9]/      # 任一數字
/([a-zA-Z0-9])+/ # 字母數字組成的字串 (至少一字元)

6. 多選分支 (OR)

/phpddt\.com|phpddt|100/  # 匹配三者任一

7. 排除字元類別

/[^phpddt]/  # 匹配任一非 p/h/p/d/d/t 字元

8. 群組與反向引用

/(\w+)\s+\1/  # 匹配重複單字 (如 "hello hello")
/(?\w+)/ # 命名捕獲組 (PHP 5.2.2+)

二、修飾符 (Pattern Modifiers)

修飾符 效果
i忽略大小寫
m多行模式 (^/$ 匹配行首尾)
s單行模式 (. 匹配含換行)
x擴展模式 (忽略模式空白、允許註解)
uUTF-8 模式 (正確處理中文)
U非貪婪模式 (量詞預設最小匹配)
/pattern/iu  # 組合使用:忽略大小寫 + UTF-8

三、核心 PCRE 函數

1. preg_match() - 單次匹配檢測

$email = "user@example.com";
$pattern = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';
if (preg_match($pattern, $email)) {
    echo "Email 格式正確";
}

回傳 1 (匹配)、0 (不匹配)、false (錯誤)。

2. preg_match_all() - 全域匹配

$text = "Email: a@b.com, c@d.org";
preg_match_all('/[\w.+-]+@[\w.-]+\.\w+/', $text, $matches);
print_r($matches[0]); // 所有完整匹配
// Array ( [0] => a@b.com [1] => c@d.org )

3. preg_replace() - 搜尋替換 (最常用)

$text = "訪問 https://example.com 了解更多";
// 將 URL 自動轉為超連結
echo preg_replace(
    '/https?:\/\/[^\s]+/',
    '$0',
    $text
);
// 輸出: 訪問 https://example.com 了解更多

進階替換:回呼函數

echo preg_replace_callback(
    '/\b(\w+)\b/',
    function($m) { return strtoupper($m[1]); },
    'hello world'
); // HELLO WORLD

4. preg_split() - 正則分割字串

$str = "apple,banana;orange|grape";
$fruits = preg_split('/[,;|]+/', $str);
// Array ( [0] => apple [1] => banana [2] => orange [3] => grape )

5. preg_grep() - 陣列過濾

$arr = ["phpddt", "php100", "hello", "phpchina"];
$result = preg_grep('/^php/', $arr);
// Array ( [0] => phpddt [1] => php100 [3] => phpchina )

6. preg_quote() - 轉義特殊字元

$str = "price: $100 (50%)";
echo preg_quote($str); // price: \$100 \(50\%\)

四、實戰範例集

1. 手機號驗證 (中國大陸)

function is_mobile($phone) {
    return preg_match('/^1[3-9]\d{9}$/', $phone);
}

2. 身份證號驗證 (18 位)

function is_idcard($id) {
    return preg_match('/^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/', $id);
}

3. 提取 HTML 標籤屬性

$html = 'Logo';
preg_match_all('/(\w+)="([^"]*)"/', $html, $m, PREG_SET_ORDER);
foreach ($m as $attr) {
    echo "$attr[1] = $attr[2]\n";
}
// src = logo.png
// alt = Logo
// class = img-responsive

4. 移除 HTML 標籤保留文字

$clean = preg_replace('/<[^>]+>/', '', $html);
// 或更嚴謹:strip_tags() 內建函數

5. 千分位格式化數字

echo preg_replace('/(\d)(?=(\d{3})+(?!\d))/', '$1,', '1234567.89');
// 1,234,567.89

五、效能與最佳實踐

  1. 預編譯模式:靜態變數儲存模式,避免重複編譯
    static $pattern = null;
    if ($pattern === null) $pattern = '/complex_pattern/';
  2. 使用具體錨點:^、$、\b 大幅減少回溯
  3. 避免巢狀量詞:(a+)+、(.*)* 易導致災難性回溯
  4. 非貪婪量詞:.*?、.+? 替代 .*、.+
  5. 能用字串函數就不用正則:strpos、substr、explode 效能高數倍
  6. 啟用 JIT (PHP 8+):pcre.jit=1 (預設開啟)

六、線上測試工具推薦

掌握正則表達式,能以極簡代碼解決複雜字串處理問題。但記住:正則威力大,維護成本也高,關鍵業務邏輯務必加上詳細註解與單元測試。

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