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

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

     編輯:PHP 相關知識

正則表達式是字串模式比對、擷取、替換的利器。PHP 提供兩套函式庫:PCRE(Perl Compatible Regular Expressions) 以 preg_* 為前綴,功能強大且與 Perl 相容;POSIX 以 ereg_* 為前綴,自 PHP 5.3 棄用,PHP 7.0 移除。本文聚焦 PCRE 實戰應用。

PCRE 模式基本結構

模式以分隔符包裹,常用 /,如 /apple/i。分隔符可為任意非字母數字、非反斜線、非空白字元(如 #、~、%)。

常用元字符速查表

元字符說明等價類別
\A字串開頭—
\Z字串結尾(忽略末尾換行)—
\b單字邊界—
\B非單字邊界—
\d數字[0-9]
\D非數字[^0-9]
\w字母、數字、底線[0-9a-zA-Z_]
\W非單字字元[^0-9a-zA-Z_]
\s空白字元[\f\t\v\n\r]
\S非空白字元[^\f\t\v\n\r]

模式修飾符

  • i:大小寫不敏感
  • m:多行模式(^/$ 匹配行首尾)
  • s:單行模式(. 匹配換行)
  • x:忽略模式中的空白與註解
  • u:UTF-8 模式(處理中文必備)
  • U:貪婪模式反轉(預設非貪婪)
  • e:preg_replace 替換字串作為程式碼執行(已棄用,改用 preg_replace_callback)

捕獲群組與反向引用

  • (...):捕獲群組,可用 \1、\2... 反向引用。
  • (?:...):非捕獲群組,不佔用反向引用編號,效能略優。
  • 命名捕獲:(?P...),引用用 \k 或 \g{name}。

核心 PCRE 函式

函式用途
preg_match執行一次匹配,回傳 0/1,第三參數接收捕獲結果
preg_match_all全域匹配,回傳匹配次數,第三參數接收多維陣列
preg_replace搜尋並替換,支援回呼函式
preg_split依正則分割字串為陣列
preg_grep過濾陣列中匹配模式的元素
preg_quote轉義字串中所有正則特殊字元

實戰範例集錦

1. 匹配表單 action 屬性(排除絕對路徑)

$str = '<form action="/login"><form action="https://evil.com">';
preg_match_all('/\s+action="(?!http:)(.*?)"/', $str, $matches);
// $matches[1] = ['/login']

2. 回呼函式動態替換

function search($url, $match) { return $url . '/' . $match; }
$str = '<form action="user/login">';
$str = preg_replace('/(?<=\saction=")(?!http:)(.*?)(?="\s)/', 'search("https://api.example.com", "$1")', $str);
// 結果:

3. 斷言匹配無屬性 HTML 標籤內容

$str = '<b>bold</b> <font color="red">text</font>';
preg_match_all('/(?<=<(\w{1})>).*(?=<\/1>)/', $str, $matches);
// 僅匹配 bold 的 "bold"

4. 批次替換 HTML 中相對路徑

$form_html = preg_replace(
    '/(?<=\saction="|\ssrc="|\shref=")(?!http:|javascript)(.*?)(?="\s)/',
    'add_url($url, "$1")',
    $form_html
);

效能與選擇建議

正則功能強大但編寫除錯成本高。簡單字串切割優先用 explode、strpos、substr;複雜驗證、擷取才用正則。PCRE 執行效率通常優於 POSIX,且語法與 Perl/JS 相通,學習投資回報率最高。

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