strstr() - 取得子字串 (從找到處到結尾)
語法
strstr(string $haystack, string $needle, bool $before_needle = false): string|false
$haystack:被搜尋的字串
$needle:搜尋目標 (若為整數,視為字元的 ASCII 值)
$before_needle:若為 true,回傳找到處 之前 的部分 (PHP 5.3+)
範例
<?php
echo strstr("明日編程詞典", "編") . "<br>"; // 編程詞典
echo strstr("www.111c.net", "111") . "<br>"; // 111c.net
echo strstr("0431-84972266", "8") . "<br>"; // 84972266
// $before_needle 範例
echo strstr("user@example.com", "@", true) . "<br>"; // user
?>
strpos() - 取得位置索引 (整數)
語法
strpos(string $haystack, string $needle, int $offset = 0): int|false
$offset:從指定位置開始搜尋 (可為負數,表示從結尾倒數)
範例
<?php
$pos = strpos("Hello world!", "wo");
echo $pos . "<br>"; // 6
// 正確判斷是否找到
$str = "abcdef";
if (strpos($str, "a") !== false) { echo "找到 'a' 於位置 0<br>"; }
if (strpos($str, "z") === false) { echo "找不到 'z'<br>"; }
// 從指定位置搜尋
echo strpos("abcabc", "a", 2) . "<br>"; // 3 (從索引 2 開始找下一個 a)
?>
關鍵差異比較
| 特性 | strstr() | strpos() |
| 回傳值 | 子字串 (含 needle) / false | 索引位置 (int) / false |
| 主要用途 | 擷取關鍵字後的內容 | 判斷是否存在、計算位置、配合 substr() 切割 |
| 大小寫敏感 | 是 (對應 stristr()) | 是 (對應 stripos()) |
| 多位元組支援 | 否 (用 mb_strstr()) | 否 (用 mb_strpos()) |
實務應用範例
1. 解析 Email 使用者名稱
$email = "user.name@example.com";
$username = strstr($email, "@", true); // PHP 5.3+
// 或
$username = substr($email, 0, strpos($email, "@"));
2. 檢查關鍵字是否存在 (效能較佳)
if (strpos($content, "敏感詞") !== false) {
// 處理違規內容
}
3. 取得最後一次出現位置
$lastSlash = strrpos($url, "/");
$filename = substr($url, $lastSlash + 1);
總結
- 需「取得子字串」用
strstr() / strrchr()。
- 需「判斷存在」或「取得位置」用
strpos() / strrpos() (記得 === false)。
- 處理 UTF-8 中文請改用
mb_strpos(), mb_strstr() 等 mbstring 函式。