stripos

(PHP 5, PHP 7, PHP 8)

stripos在字符串中查找不区分大小写的子字符串首次出现的位置

描述

stripos(string $haystack, string $needle, int $offset = 0): int|false

查找 needlehaystack 字符串中首次出现的位置。

strpos() 不同,stripos() 不区分大小写。

参数

haystack

要搜索的字符串。

needle

要搜索的字符串。

在 PHP 8.0.0 之前,如果 needle 不是字符串,它将被转换为整数并应用为字符的序号。此行为在 PHP 7.3.0 中已弃用,强烈建议不要依赖它。根据预期行为,needle 应显式转换为字符串,或对 chr() 进行显式调用。

offset

如果指定,搜索将从字符串开头开始计算的这个字符数开始。如果偏移量为负数,搜索将从字符串结尾开始计算的这个字符数开始。

返回值

返回 needle 相对于 haystack 字符串开头的存在位置(独立于偏移量)。另请注意,字符串位置从 0 开始,而不是 1。

如果未找到 needle,则返回 false

警告

此函数可能返回布尔值 false,但也可能返回一个非布尔值,该值计算为 false。有关详细信息,请阅读有关 布尔值 的部分。使用 === 运算符 测试此函数的返回值。

变更日志

版本 描述
8.2.0 大小写折叠不再依赖于使用 setlocale() 设置的区域设置。将只执行 ASCII 大小写折叠。非 ASCII 字节将通过其字节值进行比较。
8.0.0 needle 现在接受空字符串。
8.0.0 不再支持将 int 作为 needle 传递。
7.3.0 int 作为 needle 传递已弃用。
7.1.0 已添加对负 offset 的支持。

示例

示例 #1 stripos() 示例

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

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

// 不,'a' 当然不在 'xyz' 中
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 年前
我发现自己需要在同一个干草堆中找到多个针的位置。所以我写了这个小函数

<?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
5 年前
在字符串中查找数字需要先将数字转换为字符串。

strpos("123", 2) !== strpos("123", "2")
spam at kleppinger dot com
9 年前
关于 spam at wikicms dot org 的函数

使用与现有 PHP 函数相同的函数名,但输出格式不同的做法非常糟糕。未来维护代码的人可能会对此感到非常困惑。它也很难从代码库中根除,因为命名相同,所以必须分析每个 stripos() 的使用情况,以查看它期望的输出格式(布尔值或数字/布尔值)。

将其称为 string_found() 或类似名称将更有利于长期使用。
Ian Macdonald
8 年前
关于 === 注解,可能值得澄清的是,用于检测二进制找到/未找到条件的正确测试是 !==false 用于检测找到,而 ===false 用于检测未找到。
To Top