| 函數 | 用途 | 回傳值 | 常見參數 |
|---|---|---|---|
strpos($haystack, $needle, $offset=0) | 搜尋子字串首次出現位置 | 整數位置(0 起),找不到回傳 false | $offset 可指定起始搜尋位置 |
substr($string, $start, $length=null) | 截取部分字串 | 截取後的字串,失敗回傳 false | $start 正數=從開頭、負數=從結尾、0=第一字元;$length 正數=長度、負數=從結尾往前略過 |
strstr($haystack, $needle, $before_needle=false) | 從子字串位置分割字串 | 預設回傳 $needle 及其後內容;$before_needle=true 回傳之前內容 | PHP 5.3+ 支援第三參數 |
<?php
$str = 'Hello world!';
$pos = strpos($str, 'wo');
var_dump($pos); // int(6)
if ($pos !== false) {
echo "找到於索引 $pos";
} else {
echo '未找到';
}
?>
注意:必須使用 !== false 判斷,因為位置 0 會被視為 false。
<?php
$str = 'Hello world!';
// 從索引 6 取 5 個字元
echo substr($str, 6, 5); // world
// 從倒數第 6 個字元取到結尾
echo substr($str, -6); // world!
// 取前 5 個字元
echo substr($str, 0, 5); // Hello
// 取開頭到倒數第 7 個字元之前
echo substr($str, 0, -7); // Hel
?>
<?php
$email = 'user@example.com';
// 取得 @ 及之後部分(預設行為)
$domain = strstr($email, '@'); // @example.com
// 取得 @ 之前部分(PHP 5.3+)
$user = strstr($email, '@', true); // user
// 搭配 substr 處理
$userAlt = substr($email, 0, strpos($email, '@')); // user (相容舊版)
?>
mb_strpos()、mb_substr()、mb_strstr(),並設定 mb_internal_encoding('UTF-8')。stripos()、stristr()。strpos/stripos 回傳 false;strstr/stristr 回傳 false;substr 回傳 false(PHP 8.0+ 拋出 ValueError)。strpos() !== false 比 strstr() 更快(不需複製字串)。preg_match();固定寬度切割可用 str_split() 或 unpack()。<?php
function parseQueryString($url) {
$queryStart = strpos($url, '?');
if ($queryStart === false) return [];
$query = substr($url, $queryStart + 1);
$pairs = explode('&', $query);
$params = [];
foreach ($pairs as $pair) {
$eqPos = strpos($pair, '=');
if ($eqPos !== false) {
$key = urldecode(substr($pair, 0, $eqPos));
$value = urldecode(substr($pair, $eqPos + 1));
} else {
$key = urldecode($pair);
$value = '';
}
$params[$key] = $value;
}
return $params;
}
$url = 'https://example.com/search?q=php+string&page=2&lang=zh';
print_r(parseQueryString($url));
/*
Array
(
[q] => php string
[page] => 2
[lang] => zh
)
*/
?>