2024 PHP Conference Japan (日本 PHP 研討會)

stripos

(PHP 5, PHP 7, PHP 8)

stripos尋找字串中第一個出現的不區分大小寫子字串的位置

說明

stripos(字串 $haystack, 字串 $needle, 整數 $offset = 0): 整數|false

尋找 needlehaystack 字串中第一次出現的數字位置。

strpos() 不同,stripos() 不區分大小寫。

參數

haystack

要在其中搜尋的字串。

needle

要搜尋的字串。

在 PHP 8.0.0 之前,如果 needle 不是字串,它會被轉換為整數並作為字元的序數值。此行為自 PHP 7.3.0 起已被棄用,強烈不建議依賴此行為。根據預期行為,needle 應明確轉換為字串,或明確呼叫 chr() 函式。

offset

如果指定,搜尋將從字串開頭算起的這個字元數開始。如果偏移量為負數,則搜尋將從字串結尾算起的這個字元數開始。

返回值

返回 needle 相對於 haystack 字串開頭的位置(與 offset 無關)。另請注意,字串位置從 0 開始,而不是 1。

如果找不到 needle,則返回 false

警告

此函式可能返回布林值 false,但也可能返回評估為 false 的非布林值。請閱讀 布林值 的章節以了解更多資訊。使用 === 運算子 來測試此函式的返回值。

更新日誌

版本 說明
8.2.0 大小寫轉換不再取決於使用 setlocale() 設定的地區設定。只會進行 ASCII 大小寫轉換。非 ASCII 位元組將按其位元組值進行比較。
8.0.0 needle 現在接受空字串。
8.0.0 不再支援傳遞 整數 作為 needle
7.3.0 傳遞 整數 作為 needle 已被棄用。
7.1.0 已新增對負 offset 的支援。

範例

範例 #1 stripos() 範例

<?php
$findme
= 'a';
$mystring1 = 'xyz';
$mystring2 = 'ABC';

$pos1 = stripos($mystring1, $findme);
$pos2 = stripos($mystring2, $findme);

// 'xyz' 中肯定沒有 'a'
if ($pos1 === false) {
echo
"字串 '$findme' 並未在字串 '$mystring1' 中找到";
}

// 注意我們使用了 ===。只使用 == 無法得到預期的結果
// 因為 'a' 的位置是第 0 個(第一個)字元。
if ($pos2 !== false) {
echo
"我們在 '$mystring2' 的第 $pos2' 個位置找到了 '$findme'";
}
?>

注意事項

注意此函式為二進位安全。

參見

  • mb_stripos() - 在另一個字串中查找第一個出現的字串的位置(不區分大小寫)
  • str_contains() - 判斷一個字串是否包含給定的子字串
  • str_ends_with() - 檢查字串是否以給定的子字串結尾
  • str_starts_with() - 檢查字串是否以給定的子字串開頭
  • strpos() - 查找子字串在字串中第一次出現的位置
  • strrpos() - 查找子字串在字串中最後一次出現的位置
  • strripos() - 查找子字串在字串中最後一次出現的位置(不區分大小寫)
  • stristr() - 不區分大小寫的 strstr
  • substr() - 返回字串的一部分
  • str_ireplace() - str_replace 的不區分大小寫版本

新增註釋

使用者貢獻的註釋 5 則註釋

emperorshishire at gmail dot com
15 年前
我發現我需要在一個 haystack 中找到多個 needles 的第一個位置。所以我寫了這個小函式

<?php
function multineedle_stripos($haystack, $needles, $offset=0) {
foreach(
$needles as $needle) {
$found[$needle] = stripos($haystack, $needle, $offset);
}
return
$found;
}

// 它的使用方法如下:
$haystack = "The quick brown fox jumps over the lazy dog.";
$needle = array("fox", "dog", ".", "duck")
var_dump(multineedle_stripos($haystack, $needle));
/* 輸出:
array(3) {
["fox"]=>
int(16)
["dog"]=>
int(40)
["."]=>
int(43)
["duck"]=>
bool(false)
}
*/
?>
sorrynorealemail at example dot com
6 年前
與 strpos() 不同,stripos() 似乎在 needle 為空字串 '' 時不會發出警告。
emanuel dot karlsson at rolfsbuss dot se
6 年前
在字串中查找數字需要先將數字轉換為字串。

strpos("123", 2) !== strpos("123", "2")
spam at kleppinger dot com
9 年前
關於 spam at wikicms dot org 的函式

使用與現有 PHP 函式相同的名稱但具有不同的輸出格式是非常不好的做法。將來維護程式碼的人可能會因此感到非常困惑。也很難從程式碼庫中移除,因為命名相同,因此必須分析每次使用 stripos() 的情況,以查看其預期的輸出格式(布林值或數字/布林值)。

將其命名為 string_found() 或類似的名稱對於長期使用會更有意義。
Ian Macdonald
9 年前
關於 === 的說明,可能需要澄清一下,用於檢測二進位找到/未找到條件的正確測試是 !==false 表示找到,===false 表示未找到。
To Top