萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 正則表達式完整指南:PCRE 模式、元字符、修飾符與實戰範例

正則表達式基礎

正則表達式是描述字串模式的語言,PHP 採用 PCRE (Perl Compatible Regular Expressions) 引擎,函數族群以 preg_ 開頭(preg_match、preg_replace、preg_split 等)。

核心元字符與原子表

類別符號說明
字元類別.任意單一字元(除換行符,s 修飾符可含換行)
\d數字 0-9,等同 [0-9]
\D非數字
\w單字字元:字母、數字、底線,等同 [a-zA-Z0-9_]
\W非單字字元
\s空白字元:空格、Tab、換行、換頁
自訂字元類別[abc]匹配 a、b、c 任一字元
[^abc]匹配非 a、b、c 的任一字元
[a-z]範圍:a 到 z
量詞*0 次或多次(貪婪)
+1 次或多次(貪婪)
?0 次或 1 次
{m}恰好 m 次
{m,n}m 到 n 次
定位符^字串開頭(m 修飾符時為行首)
$字串結尾(m 修飾符時為行尾)
\b單字邊界
\B非單字邊界
分組與捕獲(...)捕獲群組,可反向參考 \1、\2...
非捕獲分組(?:...)僅分組不捕獲,效能較好
或邏輯|匹配左右任一模式

常用修飾符

實戰範例

Email 驗證

<?php
$pattern = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';
$emails = ['test@example.com', 'invalid@', 'user@domain.cn'];
foreach ($emails as $email) {
    echo $email . ': ' . (preg_match($pattern, $email) ? '有效' : '無效') . "\n";
}
?>

HTML 標籤提取

<?php
$html = '

內容

'; preg_match_all('/<([a-z]+)[^>]*>(.*?)<\/\1>/is', $html, $matches); print_r($matches[2]); // 內容 ?>

中文分詞邊界

<?php
$text = "你好世界";
preg_match_all('/\p{Han}+/u', $text, $matches);  // 需 u 修飾符
print_r($matches[0]);  // ["你好", "世界"]
?>

替換與回呼

<?php
// 將數字加粗
echo preg_replace('/(\d+)/', '$1', '價格 123 元');  // 價格 123 元

// 回呼函數處理
echo preg_replace_callback('/(\d+)/', function($m) {
    return $m[1] * 2;
}, '價格 123 元');  // 價格 246 元
?>

常用 preg_ 函數族

修飾符說明
i忽略大小寫
m多行模式:^/$ 匹配行首尾
s單行模式:. 匹配含換行
x擴展模式:忽略模式空白、允許註解
uUTF-8 模式(處理中文必備)
U非貪婪模式(量詞預設最小匹配)
函數用途
preg_match()匹配一次,回傳 0/1/false
preg_match_all()全域匹配所有,回傳次數
preg_replace()搜尋替換
preg_replace_callback()回呼函數替換
preg_split()正則分割字串
preg_quote()跳脫正則特殊字元
preg_grep()過濾陣列元素
preg_last_error()取得最後錯誤代碼

效能與安全建議

  • 避免災難性回溯:慎用 (.*)、(.+) 巢狀量詞,改用具體字元類別或非貪婪 .*?。
  • 固定前綴模式效能最佳(如 /^prefix/)。
  • 使用者輸入納入模式時,必須用 preg_quote() 跳脫。
  • 複雜模式善用 x 修飾符加註解提升可讀性。
  • 編譯緩存:相同模式重複使用時,PHP 會快取編譯結果。

線上測試工具

正則表達式功能強大但複雜,善用工具驗證、保持模式簡潔、優先考慮專用函數(如 filter_var 驗證 Email/URL),能事半功倍。

copyright © 萬盛學電腦網 all rights reserved