在PHP 中處理字符串時,常常需要查找某個子串是否存在於另一個字符串中。對於包含多字節字符(如中文、日文、韓文等)的字符串,使用普通的字符串函數(如strstr或strpos )可能會出現亂碼或識別錯誤。這時,就可以用上mb_stristr這個多字節安全的函數。
mb_stristr是PHP 多字節字符串擴展(mbstring)提供的函數,用於查找字符串中第一次出現的某個子串。它與stristr類似,但支持多字節編碼,默認使用UTF-8。
函數定義如下:
mb_stristr(string $haystack, string $needle, bool $before_needle = false, ?string $encoding = null): string|false
$haystack :要搜索的原始字符串;
$needle :要查找的子串;
$before_needle (可選):如果為true ,則返回needle 之前的部分;
$encoding (可選):字符編碼,默認是內部編碼(一般為UTF-8);
返回值:找到則返回剩餘字符串(或前綴部分),找不到返回false 。
假設我們要查找一個網址中是否包含特定的關鍵詞,並獲取從該關鍵詞開始的部分:
<?php
$url = "https://gitbox.net/docs/php/mbstring-guide";
$result = mb_stristr($url, "php");
if ($result !== false) {
echo "找到了子串,結果為:$result";
} else {
echo "未找到子串";
}
?>
輸出:
找到了子串,結果為:php/mbstring-guide
說明mb_stristr成功找到了第一次出現的“php”,並返回了從那一部分開始的字符串。
有時候我們更關心子串前面的部分,比如獲取主路徑:
<?php
$url = "https://gitbox.net/docs/php/mbstring-guide";
$result = mb_stristr($url, "php", true);
if ($result !== false) {
echo "關鍵詞前的部分是:$result";
} else {
echo "未找到子串";
}
?>
輸出:
關鍵詞前的部分是:https://gitbox.net/docs/
當第三個參數為true時, mb_stristr返回的是needle 之前的內容。
假設我們處理一個包含中文的句子:
<?php
$text = "歡迎來到gitbox.net,這是一個優秀的PHP資源庫。";
$result = mb_stristr($text, "php");
if ($result !== false) {
echo "找到了:$result";
} else {
echo "沒有找到匹配內容";
}
?>
注意這裡的“PHP”是大小寫不敏感查找的,所以即使是"php" 小寫,也可以匹配成功。
mb_stristr是大小寫不敏感的,而mb_strpos是大小寫敏感的;
mb_stristr返回的是匹配到的子字符串及其後面的部分,而mb_strpos返回的是位置;
最重要的一點, mb_stristr支持多字節字符,避免中文亂碼。
mb_stristr是處理多字節字符串中查找子串任務的強大工具,尤其適用於UTF-8 編碼環境中。它的語法簡單、功能實用,非常適合用來快速定位並提取字符串中的關鍵部分。
當你在開發PHP 應用,尤其是在處理中文內容、URL 路徑或用戶輸入時,優先考慮使用mb_stristr ,可以有效避免字符截斷和亂碼的問題。