PHP Conference Japan 2024

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 字符串开头的存在位置(与偏移量无关)。另请注意,字符串位置从 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);

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

// 注意我们使用了 ===。简单的 == 不会按预期工作
// 因为 '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)
}
*/
?>
[email protected]
6 年前
与 strpos() 不同,stripos() 似乎在搜索字符串为空字符串 '' 时不会发出警告。
[email protected]
6 年前
在字符串中查找数字需要先将数字转换为字符串。

strpos("123", 2) !== strpos("123", "2")
[email protected]
9 年前
关于 [email protected] 编写的函数

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

将其命名为 string_found() 或类似名称对于长期使用更有意义。
Ian Macdonald
9 年前
关于 === 的说明,可能值得澄清的是,用于二元查找/未找到条件的正确测试是 !==false 用于检测已找到,===false 用于检测未找到。
To Top