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

PHP 小經驗:解析 preg_match 與 preg_match_all 函數差異與應用

     編輯:PHP 綜合知識

PHP PCRE 正則表達式函數全面指南

PHP 採用 Perl 兼容正則表達式 (PCRE),提供 preg_match()、preg_match_all()、preg_replace()、preg_split() 等核心函數。本文重點解析匹配類函數的差異與實戰技巧。

定界符規則

  • 正則模式必須包裹在定界符中:/pattern/、#pattern#、~pattern~
  • 定界符:非字母、數字、反斜線的字符,常用 /、#、%
  • 模式內出現定界符需轉義:/http:\/\// 或改用 #https://#

preg_match() —— 單次匹配

語法

int preg_match(string $pattern, string $subject, array &$matches = null)
  • 返回:1 (匹配)、0 (不匹配)、false (錯誤)
  • 首次匹配成功即停止,不繼續搜尋
  • $matches[0]:完整匹配內容;$matches[1]:第一個捕獲組...以此類推

範例 1:大小寫不敏感搜尋

<?php
if (preg_match("/php/i", "PHP is the web scripting language", $matches)) {
    echo "找到: " . $matches[0]; // 輸出: PHP
} else {
    echo "未找到";
}

範例 2:從 URL 提取主機域名

<?php
preg_match("/^(http:\/\/)?([^\/]+)/i", "https://www.jb51.net/index.html", $matches);
$host = $matches[2]; // www.jb51.net
preg_match("/[^\.]+\.[^\.]+$/", $host, $matches);
echo "域名: {$matches[0]}"; // 輸出: jb51.net

preg_match_all() —— 全局匹配

語法

int preg_match_all(string $pattern, string $subject, array &$matches, int $flags = PREG_PATTERN_ORDER)
  • 返回:完整匹配次數 (可能為 0),錯誤返回 false
  • 搜尋至字串結尾,找出所有匹配
  • 旗標控制 $matches 結構:

旗標對比

範例:高亮所有 <pre> 標籤內的關鍵字

<?php
$str = "<pre>學習php是一件快樂的事。</pre><pre>所有的phper需要共同努力!</pre>";
$kw = "php";
preg_match_all('/<pre>([\s\S]*?)<\/pre>/', $str, $mat);
for ($i = 0; $i < count($mat[0]); $i++) {
    $mat[0][$i] = $mat[1][$i];
    $mat[0][$i] = str_replace($kw, '<span style="color:#ff0000">'.$kw.'</span>', $mat[0][$i]);
    $str = str_replace($mat[1][$i], $mat[0][$i], $str);
}
echo $str;

中文漢字正則匹配

旗標結構說明適用場景
PREG_PATTERN_ORDER (預設)$matches[0] 全部完整匹配;$matches[1] 第一個捕獲組所有匹配...提取特定捕獲組所有值
PREG_SET_ORDER$matches[0] 第一組所有捕獲;$matches[1] 第二組...逐組處理(如替換每個匹配)
PREG_OFFSET_CAPTURE每個結果包含 [匹配內容, 位移]需知道匹配位置
編碼正則模式說明
GBK/GB2312/[\x80-\xff]+/ 或 /[\xa1-\xff]+/雙位元組中文範圍
UTF-8/[\x{4e00}-\x{9fa5}]+/uUnicode CJK 統一表意文字區塊,需 u 修飾符

測試代碼

<?php
$str = "學習php是一件快樂的事。";
// GBK 環境
preg_match_all("/[\x80-\xff]+/", $str, $match);
// UTF-8 環境
preg_match_all("/[\x{4e00}-\x{9fa5}]+/u", $str, $match);
print_r($match);
/* 輸出:
Array (
    [0] => Array (
        [0] => 學習
        [1] => 是一件快樂的事。
    )
)
*/

效能建議

  • 簡單字串操作優先用 strpos()、str_replace()、explode() 等原生函數
  • 正則編譯有開銷,循環中避免重複編譯同一模式
  • 複雜正則考慮預編譯或改用解析器

掌握 preg_match 與 preg_match_all 的核心差異(單次 vs 全局)、捕獲組結構、旗標應用,能高效解決 90% 的字串提取需求。

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