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

PHP 正則表達式完全學習手冊(上):核心語法與原理詳解

     編輯:PHP 相關知識

前言

正則表達式(Regular Expression,Regex)是文本處理的「瑞士軍刀」:語法晦澀,但掌握後能以極少代碼解決複雜的字符串匹配、驗證、提取、替換問題。本系列共 5 篇,本文為第一部分,奠定核心概念基礎。

1. 正則表達式的歷史溯源

  • 1943:McCulloch & Pitts 提出神經網絡數學模型。
  • 1956:Stephen Kleene 發表《神經網事件的表示法》,引入「正則集合」與「正則表達式」概念。
  • 1968:Ken Thompson(Unix 之父)將其應用於 QED 編輯器,實現文本搜索——正則表達式首次工程化落地。
  • 至今:成為 Perl、PHP、Java、JavaScript、Python、C#、Go、Rust 等主流語言標準庫組件,及 grep、sed、awk、Vim、VS Code 等工具核心功能。

2. 正則表達式定義

正則表達式是一種字符模式模板,由普通字符(字面量)和元字符(特殊符號)組成,用於描述字符串匹配規則。核心能力三大類:

  1. 驗證:字符串是否符合模式(如郵箱、手機號、身份證)。
  2. 提取:從文本中獲取符合條件的子串(如爬蟲解析、日誌分析)。
  3. 替換:將匹配部分替換為指定內容(如敏感詞過濾、格式化)。

區別:Shell 通配符 *.txt 中 * 表示「任意字符」,正則中 * 表示「前一字符出現 0 次或多次」。兩者語義完全不同,切勿混淆。

3. 核心語法體系(速查表)

3.1 普通字符

字母、數字、漢字、下劃線、大多數標點:字面匹配自身。
/php/ 匹配 "php"、"php教程" 中的 "php"。

3.2 非打印字符(轉義序列)

符號含義
\n換行符 (LF, ASCII 10)
\r回車符 (CR, ASCII 13)
\t製表符 (Tab, ASCII 9)
\s任意空白字符(空格、\t、\n、\r、\f、\v)
\S任意非空白字符
\d數字 [0-9]
\D非數字 [^0-9]
\w單詞字符 [a-zA-Z0-9_](含下劃線)
\W非單詞字符

3.3 元字符(特殊字符)

3.4 限定符(量詞)

符號含義需轉義?
.匹配除換行符外任意字符在字符類 [] 內不需
^行首錨點(多行模式下為行首)在 [] 開頭需轉義
$行尾錨點(多行模式下為行尾)在 [] 內不需
|或運算(分支)是
()分組、捕獲、改變優先級是
[]字符類(集合)是
{}量詞精確範圍是
\轉義符是
符號含義等價寫法貪婪/懶惰
*0 次或多次{0,}貪婪
+1 次或多次{1,}貪婪
?0 次或 1 次{0,1}貪婪
{n}恰好 n 次-貪婪
{n,}至少 n 次-貪婪
{n,m}n 到 m 次-貪婪
*? +? ?? {n,m}?懶惰模式(盡可能少匹配)-懶惰

3.5 定位符(錨點)

  • ^:字符串開始(多行模式 m 時為行首)
  • $:字符串結束(多行模式 m 時為行尾)
  • \b:單詞邊界(\w 與 \W 交界)
  • \B:非單詞邊界
  • \A:絕對字符串開始(不受多行模式影響)
  • \Z:絕對字符串結束(允許末尾 \n)
  • \z:絕對字符串結束(不允許末尾 \n)

3.6 選擇(分支)

pattern1|pattern2|pattern3:從左到右嘗試匹配,首個成功即返回。順序影響性能與結果。

3.7 後向引用

\1、\2...\9:引用前面捕獲組匹配的內容。
/(['\"])(.*?)\1/ 匹配單雙引號包裹的字符串(引號必須成對)。

4. 運算符優先級(高到低)

  1. \ 轉義
  2. () (?:) (?=) 分組/斷言
  3. * + ? {} 量詞
  4. ^ $ \b 錨點/序列連接
  5. | 分支(或)

善用括號改變優先級:/ab|c/ 匹配 "ab" 或 "c";/a(b|c)/ 匹配 "ab" 或 "ac"。

5. 實戰範例:郵箱驗證演進

<?php
// 初級:簡單但不準
$pattern1 = '/^.+@.+\..+$/';

// 進階:符合 RFC 5322 簡化版(推薦實際項目使用)
$pattern2 = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';

// 實戰函數
function isValidEmail($email) {
    return (bool)preg_match('/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', $email);
}

var_dump(isValidEmail('test@example.com')); // true
var_dump(isValidEmail('invalid'));          // false
?>

6. 學習路線圖

  1. 掌握核心語法:本文 3.1-3.7 節(本周完成)。
  2. 熟練 PHP 函數族:preg_match、preg_match_all、preg_replace、preg_split、preg_quote(下篇講解)。
  3. 理解引擎原理:回溯、貪婪/懶惰、災難性回溯防範(進階篇)。
  4. 實戰項目練習:表單驗證、日誌解析、模板引擎、數據清洗。

勸告:正則表達式強大但不可濫用。能用 strpos、explode、json_decode、DOM 解析器解決的,絕不寫正則。正則是「最後手段」,而非「首選工具」。

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