函式對照表
| 函式 | 搜尋方向 | 回傳值型別 | 說明 |
strstr() | 左至右 (首次出現) | 字串 / false | 回傳從找到處到字串結尾的子字串 |
strrchr() | 右至左 (最後一次出現) | 字串 / false | 回傳從找到處到字串結尾的子字串 |
strpos() | 左至右 (首次出現) | 整數 (位置) / false | 回傳位置索引 (0 起算),需用 === false 判斷失敗 |
strrpos() | 右至左 (最後一次出現) | 整數 (位置) / false | 回傳位置索引,需用 === false 判斷失敗 |
程式碼範例與輸出
<?php
// 1. strstr / strrchr 回傳子字串
$str = "天高任鳥飛,海闊憑魚躍";
echo "原始字串:$str<br>";
echo 'strstr($str, ",") => ' . strstr($str, ",") . "<br>"; // 輸出:,海闊憑魚躍
echo 'strstr($str, "鳥飛") => ' . strstr($str, "鳥飛") . "<br>"; // 輸出:鳥飛,海闊憑魚躍
$str1 = "I have a great dream.";
echo "<br>原始字串:$str1<br>";
echo 'strrchr($str1, "e") => ' . strrchr($str1, "e") . "<br>"; // 輸出:eam.
echo 'strrchr($str1, "ve") => ' . strrchr($str1, "ve") . "<br>"; // 輸出:ve dream.
// 2. strpos / strrpos 回傳索引位置
$str2 = "I am an abstract about abroad.";
echo "<br>原始字串:$str2<br>";
echo 'strpos($str2, "ab") => ' . strpos($str2, "ab") . "<br>"; // 8
echo 'strpos($str2, "am") => ' . strpos($str2, "am") . "<br>"; // 2
echo 'strpos($str2, "aman") => ' . strpos($str2, "aman") . "<br>"; // false (找不到)
$str3 = "I am is wang hui.";
echo "<br>原始字串:$str3<br>";
echo 'strrpos($str3, "I") => ' . strrpos($str3, "I") . "<br>"; // 0
echo 'strrpos($str3, "an") => ' . strrpos($str3, "an") . "<br>"; // 4
echo 'strrpos($str3, "i") => ' . strrpos($str3, "i") . "<br>"; // 13 (最後一個 i)
?>
重要提醒
- 大小寫敏感:以上函式皆區分大小寫。不分大小寫版本請用
stristr(), stripos(), strripos() (無 strrichr)。
- strpos/strrpos 判斷失敗:因為可能回傳
0 (第一個字元),必須使用 === false 嚴格比較,不可用 if (!$pos) 或 == false。
strstr() 從 PHP 5.3 起支援第三個參數 $before_needle (為 true 時回傳找到處之前的部分)。
- 處理多位元組字串 (UTF-8 中文) 時,建議使用
mb_strpos(), mb_strrpos(), mb_strstr() 等 mbstring 對應函式,避免位置索引錯誤。
適用情境
strstr/strrchr:需要取得「關鍵字之後的內容」(如解析 Email 域名 strstr($email, '@'))。
strpos/strrpos:需要判斷「是否包含」或「出現位置」以進行切割、替換等操作。