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

PHP 字符串查找與匹配:strstr、strpos、preg_match 詳解

     編輯:PHP 相關知識

核心函數對比

函數用途返回值大小寫敏感性能
strstr查找子串首次出現,返回從該處到結尾的字符串字符串/false是快
stristrstrstr 不區分大小寫版字符串/false否快
strpos查找子串首次出現位置(索引)int/false是最快
striposstrpos 不區分大小寫版int/false否快
strrpos查找子串最後一次出現位置int/false是快
preg_match正則表達式匹配1/0/false按模式較慢

strstr / stristr 實戰

<?php
$haystack = "https://www.example.com/path?query=value";
$needle = "example.com";

// 判斷是否包含
if (strstr($haystack, $needle)) {
    echo "包含 $needle";
}

// 獲取域名後部分
$domainPart = strstr($haystack, '://');
echo $domainPart; // ://www.example.com/path?query=value

// 不區分大小寫
if (stristr($haystack, 'EXAMPLE')) {
    echo "找到 (忽略大小寫)";
}
?>

strpos / stripos 精確判斷(必用 !== false)

<?php
$str = "abcdefg";
$pos = strpos($str, 'a'); // 0

// 錯誤寫法:if ($pos) -> 0 視為 false
// 正確寫法:
if ($pos !== false) {
    echo "在位置 $pos 找到";
}

// 從指定位置開始查找
echo strpos($str, 'c', 2); // 2
echo strpos($str, 'c', 3); // false
?>

preg_match 正則匹配

<?php
$pattern = '/\b(php|javascript|python)\b/i'; // 單詞邊界,忽略大小寫
$subject = "I love PHP and python.";

if (preg_match($pattern, $subject, $matches)) {
    echo "匹配到: " . $matches[0]; // PHP
    echo "捕獲組: " . $matches[1]; // php
}

// 全局匹配所有
preg_match_all($pattern, $subject, $allMatches);
print_r($allMatches[0]); // Array ( [0] => PHP [1] => python )
?>

單詞邊界 \b 陷阱

\b 匹配字母/數字/下劃線與非字母數字下劃線的邊界。中文、標點不屬於單詞字符,故 \b中\b 不生效。

<?php
$str = "test,admin,abc";
// 只匹配完整單詞 admin
$pattern = '/\badmin\b/';
var_dump(preg_match($pattern, $str)); // 1

// 但這樣不行:
$str2 = "管理员admin用戶";
var_dump(preg_match('/\badmin\b/', $str2)); // 0 (中文無邊界)
// 改用前瞻後顧或 Unicode 屬性 (需 PCRE 8.34+ / u 修飾符)
?>

preg_match 返回值詳解

  • 1:匹配成功(僅第一次)
  • 0:匹配失敗
  • false:正則錯誤(如模式無效)
<?php
$result = @preg_match('/(?invalid/', $str);
if ($result === false) {
    echo "正則編譯錯誤: " . preg_last_error_msg();
}
?>

雙引號與單引號模式字符串區別

<?php
$var = 'test';
// 雙引號:解析變量、轉義序列
$pattern1 = "/$var/";        // /test/
$pattern2 = "/\b$var\b/";    // /\btest\b/ (正確)

// 單引號:字面量,變量不解析,僅 \\ \' 解析
$pattern3 = '/\b$var\b/';    // /\b$var\b/ (錯誤,字面 $var)
// 正則元字符在單引號中不需雙重轉義
$pattern4 = '/\d+/';         // 匹配數字
$pattern5 = "/\\d+/";        // 雙引號需雙重轉義
?>

性能建議

  1. 簡單子串查找/判斷:strpos/stripos(最快,C 級實現)。
  2. 需獲取匹配後內容:strstr。
  3. 複雜模式、提取數據、驗證格式:preg_match。
  4. 避免在循環中重複編譯相同正則,預先編譯或用靜態變量緩存。

總結

  • strpos !== false 是判斷「包含」的標準寫法。
  • strstr 返回子串,適合「從某標記開始取內容」。
  • preg_match 功能最強但最慢,用對場景。
  • 中文分詞/邊界匹配需用 Unicode 正則或分詞庫(如 phpanalyze、jieba-php)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved