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

PHP 正則表達式實戰技巧:PCRE 函式、常用元字符、斷言與回調替換

     編輯:PHP 相關知識

正則表達式是字串處理的瑞士刀,但寫得不好既難維護又低效。本文聚焦 PHP PCRE (preg_*) 函式族,總結核心語法、常用元字符、修飾符、進階斷言、回調替換等實戰技巧,並附代碼範例。

PCRE vs POSIX 正則

  • PCRE (preg_*):Perl 相容正則,功能強大、效能較好、語法與 Perl/JS 相近,**主流推薦**。
  • POSIX (ereg_*):PHP 5.3 棄用,PHP 7 移除,**請勿在新專案使用**。

PCRE 模式分隔符與修飾符

模式需包裹在分隔符中,慣用 /pattern/modifiers:

修飾符說明
i忽略大小寫
m多行模式:^$匹配每行首尾
s單行模式:.匹配含換行的任意字元
x忽略模式中的空白(可寫註解)
uUTF-8 模式(處理中文必備)
U非貪婪模式:匹配最短字串
e替換字串視為 PHP 代碼執行(**已棄用,請用 preg_replace_callback**)

核心元字符速查

元字符含義範例
\A字串開頭
\Z字串結尾
\b單詞邊界/\bis/ 匹配以 is 開頭的單詞
\B非單詞邊界/\Bis/ 匹配 This 中的 is
\d數字 [0-9]
\D非數字 [^0-9]
\w字母數字底線 [0-9a-zA-Z_]
\W非字母數字底線
\s空白字元 [\f\t\v]
\S非空白字元

進階技巧:捕獲組、反向引用、非捕獲組

// 捕獲組:括號內匹配內容存入 $1, $2...
// 日期格式驗證:要求分隔符一致
/^\d{2}([\W])\d{2}\1\d{4}$/  // 匹配 12-31-2006、09/27/1996,不匹配 12/34-5678

// 非捕獲組 (?:...):不佔用反向引用編號
/(?:a|b|c)(D|E|F)\1g/  // 匹配 aEEg,\1 指向 (D|E|F)

常用 PCRE 函式

  • preg_match() / preg_match_all():匹配/全局匹配,回傳次數,結果存入第三參數陣列。
  • preg_quote():轉義字串中所有正則特殊字元,動態構建模式必用。
  • preg_split():正則分割字串,比 explode 強大。
  • preg_grep():以正則過濾陣列元素。
  • preg_replace() / preg_replace_callback():替換/回調替換,**棄用 /e 修飾符**。

實戰範例集錦

1. 提取表單 action 屬性(排除絕對 URL)

$str = '...ACTION="ASDF.BPHP"... ACTION="HTTP: test.php?..."...';
preg_match_all('/\s+action="(?!http:)(.*?)"\s/i', $str, $match);
// $match[1] 含相對路徑 action 值

2. 回調函數動態替換:補全相對路徑

function search($url, $match) {
    return $url . '/' . $match;
}
$str = preg_replace('/(?<=\saction=")(?!http:)(.*?)(?="\s)/e', 'search($url, "$1")', $str);
// 現代寫法:preg_replace_callback
$str = preg_replace_callback(
    '/(?<=\saction=")(?!http:)(.*?)(?="\s)/',
    function($m) use ($url) { return $url . '/' . $m[1]; },
    $str
);

3. 斷言提取無屬性 HTML 標籤內容

$str = 'xxxxxx.com.cn bold font 

paragraph text

'; preg_match_all('/(?<=<(\w{1})>).*?(?=<\/\1>)/', $str, $match); // 匹配 與

內容,利用反向引用 \1 確保標籤配對

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

$form_html = preg_replace(
    '/(?<=\saction="|\ssrc="|\shref=")(?!http:|javascript)(.*?)(?="\s)/e',
    'add_url($url, "$1")',
    $form_html
);
// 同樣建議改用 preg_replace_callback

效能與選擇建議

  • 簡單固定分隔符分割用 explode,效能遠超正則。
  • 複雜模式提取/驗證/替換才用 PCRE。
  • 啟用 u 修飾符處理 UTF-8,避免中文亂碼。
  • 避免過度嵌套量詞(如 (a*)*)導致災難性回溯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved