萬盛學電腦網

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

PHP 正則表達式完整入門:語法、函式與常用模式大全

什麼是正則表達式?

正則表達式是用於描述字串模式的強大工具,廣泛應用於驗證、搜尋、替換、分割字串。PHP 提供兩套函式庫:

  • PCRE (preg_*):Perl 相容,功能強大、效能佳,推薦使用。
  • POSIX (ereg_*):已於 PHP 7.0 移除,勿使用。

PCRE 基本語法

模式需包含在分隔符中,常用 /pattern/ 或 #pattern#。

<?php
$pattern = '/^\\d{4}-\\d{2}-\\d{2}$/'; // 日期格式 YYYY-MM-DD
$str = '2024-12-25';
if (preg_match($pattern, $str)) {
    echo '格式正確';
}
?>

核心元字符與語法

字元類別

符號說明等價寫法
\d數字[0-9]
\D非數字[^0-9]
\w字母、數字、底線[a-zA-Z0-9_]
\W非單字字元[^a-zA-Z0-9_]
\s空白字元(空格、換行、Tab)[ \t\r\n\f]
\S非空白字元[^ \t\r\n\f]
.任意字元(除換行)—

量詞

符號說明
*0 次或多次
+1 次或多次
?0 次或 1 次
{n}剛好 n 次
{n,}至少 n 次
{n,m}n 到 m 次

定位符與邊界

符號說明
^字串開頭(多行模式 m 時為行首)
$字串結尾(多行模式 m 時為行尾)
\b單字邊界
\B非單字邊界

分組與反向參考

  • (pattern):捕獲群組,可用 \1、\2... 反向參考(或 $1 在 replacement 中)。
  • (?:pattern):非捕獲群組(效能較好)。
  • (?<name>pattern):具名群組(PHP 5.2.2+),反向參考用 \k<name>。

模式修飾符

常用驗證模式庫

帳號密碼

// 使用者名稱:英數底線,6-20 字元,字母開頭
/^[a-zA-Z][a-zA-Z0-9_]{5,19}$/

// 密碼:8-20 字元,含大小寫、數字、特殊符號
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,20}$/

Email

/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/

手機號碼(台灣/中國大陸)

// 台灣手機
/^09\d{8}$/

// 中國大陸手機
/^1[3-9]\d{9}$/

URL

/^https?:\/\/([\w-]+\.)+[\w-]+(\/[\w-./?%&=]*)?$/i

身分證字號(台灣)

/^[A-Z][12]\d{8}$/

中文字元

/^[\x{4e00}-\x{9fa5}]+$/u

常用函式速查

修飾符說明
i大小寫不敏感
m多行模式(^$ 匹配行首尾)
s單行模式(. 匹配換行)
uUTF-8 模式(處理中文必備)
x忽略模式中的空白與註解(可讀性)
函式用途回傳值
preg_match執行一次匹配1/0/false,匹配結果存第三參數陣列
preg_match_all全域匹配匹配次數,結果存第三參數多維陣列
preg_replace搜尋替換替換後字串/陣列
preg_split正則分割字串陣列
preg_quote跳脫正則特殊字元字串
preg_filter僅回傳有匹配的替換結果陣列

實戰範例

範例 1:驗證並解析日期

<?php
$date = '2024-12-25';
if (preg_match('/^(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})$/', $date, $m)) {
    echo "年:{$m['y']} 月:{$m['m']} 日:{$m['d']}";
}
?>

範例 2:HTML 標籤屬性提取

<?php
$html = '<img src="photo.jpg" alt="風景" class="img-responsive">';
preg_match_all('/(\w+)="([^"]*)"/', $html, $m, PREG_SET_ORDER);
foreach ($m as $attr) {
    echo "{$attr[1]} = {$attr[2]}\n";
}
// src = photo.jpg
// alt = 風景
// class = img-responsive
?>

範例 3:敏感詞過濾

<?php
$badWords = ['bad', 'evil', 'spam'];
$pattern = '/\b(' . implode('|', array_map('preg_quote', $badWords)) . ')\b/i';
$text = 'This is a bad example with EVIL content.';
$clean = preg_replace($pattern, '***', $text);
echo $clean; // This is a *** example with *** content.
?>

效能與除錯技巧

  • ✅ 能用 strpos/str_replace 解決的不要用正則。
  • ✅ 複雜模式加 x 修飾符並加註解,提升可維護性。
  • ✅ 使用 regex101.com 除錯與解釋模式。
  • ⚠️ 避免災難性回溯:慎用 .*、.+,改用具體字元類別。
  • ⚠️ 大量資料處理考慮預編譯或非正則替代方案。

正則表達式是文字處理的利器,熟練掌握能大幅提升開發效率,但也要注意可讀性與效能平衡。

copyright © 萬盛學電腦網 all rights reserved