當前位置: 首頁> 最新文章列表> mb_strstr和mb_strpos配合使用,提取複雜字符串片段的實戰攻略

mb_strstr和mb_strpos配合使用,提取複雜字符串片段的實戰攻略

gitbox 2025-09-29

在PHP中,字符串處理是最常見的操作之一。而當你面對一個複雜的字符串時,如何高效地提取出你需要的片段,可能會成為一項挑戰。特別是當字符串中包含多種不同格式的內容時,使用正確的函數和方法就顯得尤為重要。本文將重點介紹如何使用mb_strstrmb_strpos這兩個多字節字符串函數相結合,來提取複雜字符串中的特定片段。

1. mb_strstr與mb_strpos簡介

在開始實戰之前,首先了解這兩個函數的基本用法。

  • mb_strstr :此函數用於查找一個字符串在另一個字符串中的第一次出現。與常規的strstr函數不同, mb_strstr是為支持多字節編碼(如UTF-8和Shift-JIS)而設計的,它能夠正確地處理這些編碼格式。

    文法:

     <span><span><span class="hljs-title function_ invoke__">mb_strstr</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$needle</span></span><span>, </span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-variable">$before_needle</span></span><span> = </span><span><span class="hljs-literal">false</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$encoding</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>): </span><span><span class="hljs-keyword">string</span></span><span>|</span><span><span class="hljs-literal">false</span></span><span>
    </span></span>

    參數說明:

    • $haystack :要搜索的目標字符串。

    • $needle :要查找的子字符串。

    • $before_needle :如果設置為true ,則返回needle前的部分。

    • $encoding :指定字符編碼,默認為null (即係統默認編碼)。

  • mb_strpos :此函數用於查找一個子字符串在另一個字符串中的首次出現位置,返回的是子字符串在目標字符串中的位置索引。它同樣支持多字節編碼。

    文法:

     <span><span><span class="hljs-title function_ invoke__">mb_strpos</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$needle</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$offset</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$encoding</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>): </span><span><span class="hljs-keyword">int</span></span><span>|</span><span><span class="hljs-literal">false</span></span><span>
    </span></span>

    參數說明:

    • $haystack :要搜索的目標字符串。

    • $needle :要查找的子字符串。

    • $offset :指定從哪個位置開始查找。

    • $encoding :指定字符編碼,默認為null

2. 使用場景:提取複雜字符串片段

假設我們有一個包含大量信息的字符串,例如用戶的個人資料,其中包含多個字段,如姓名、郵箱、地址等。我們的任務是從中提取出某個字段的值。

例如,給定以下字符串:

 <span><span><span class="hljs-variable">$user_info</span></span><span> = </span><span><span class="hljs-string">"姓名: 張三, 郵箱: [email protected], 地址: 北京市朝陽區"</span></span><span>;
</span></span>

我們想從中提取出郵箱部分。為了實現這一點,我們可以使用mb_strposmb_strstr函數來配合查找和提取。

3. 實戰操作

3.1 查找郵箱的位置

首先,我們需要找到“郵箱”字段在字符串中的位置。使用mb_strpos來實現:

 <span><span><span class="hljs-variable">$email_position</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_strpos</span></span><span>(</span><span><span class="hljs-variable">$user_info</span></span><span>, </span><span><span class="hljs-string">"郵箱: "</span></span><span>);
</span></span>

這個函數會返回“郵箱: ”這一部分在字符串中的位置。

3.2 使用mb_strstr提取郵箱

接下來,我們使用mb_strstr來從“郵箱: ”開始,提取出郵箱地址。為了做到這一點,我們要傳入$before_needle參數為false ,表示從“郵箱: ”開始一直提取到字符串結束:

 <span><span><span class="hljs-variable">$email_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_strstr</span></span><span>(</span><span><span class="hljs-variable">$user_info</span></span><span>, </span><span><span class="hljs-string">"郵箱: "</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>);
</span></span>

此時, $email_info的值將是:

 <span><span>郵箱</span><span><span class="hljs-punctuation">:</span></span><span> zhangsan</span><span><span class="hljs-meta">@example</span></span><span>.com, 地址</span><span><span class="hljs-punctuation">:</span></span><span> 北京市朝陽區
</span></span>

但是我們只需要郵箱部分,因此接下來,我們進一步處理。

3.3 提取純郵箱地址

為了提取純粹的郵箱地址,我們可以利用mb_strpos找到郵箱地址的結束位置,並通過mb_substr將其提取出來。

首先,我們找到郵箱的開始位置(已經知道是從“郵箱: ”之後),然後找到第一個逗號的位置,即郵箱的結束位置:

 <span><span><span class="hljs-variable">$email_start</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_strpos</span></span><span>(</span><span><span class="hljs-variable">$email_info</span></span><span>, </span><span><span class="hljs-string">"郵箱: "</span></span><span>) + </span><span><span class="hljs-number">4</span></span><span>; </span><span><span class="hljs-comment">// +4是因為“郵箱: ”的長度</span></span><span>
</span><span><span class="hljs-variable">$email_end</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_strpos</span></span><span>(</span><span><span class="hljs-variable">$email_info</span></span><span>, </span><span><span class="hljs-string">","</span></span><span>, </span><span><span class="hljs-variable">$email_start</span></span><span>); </span><span><span class="hljs-comment">// 从郵箱地址的起始位置开始查找逗号</span></span><span>
</span></span>

然後,我們使用mb_substr提取出郵箱地址:

 <span><span><span class="hljs-variable">$email</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_substr</span></span><span>(</span><span><span class="hljs-variable">$email_info</span></span><span>, </span><span><span class="hljs-variable">$email_start</span></span><span>, </span><span><span class="hljs-variable">$email_end</span></span><span> - </span><span><span class="hljs-variable">$email_start</span></span><span>);
</span></span>

此時, $email的值就是:

 <span><span>zhangsan</span><span><span class="hljs-keyword">@example</span></span><span>.com
</span></span>

4. 小結

通過結合mb_strstrmb_strpos ,我們可以非常靈活地從復雜的字符串中提取出需要的片段。關鍵在於:

  • 使用mb_strpos查找子字符串的索引位置。

  • 使用mb_strstr從指定位置提取字符串。

  • 通過mb_substr根據需要的長度進一步精確提取目標片段。

這種方法特別適用於處理包含多種信息的字符串,能夠幫助我們在實際開發中高效地獲取所需的數據。