strripos

(PHP 5, PHP 7, PHP 8)

strripos查找字符串中最后一个不区分大小写的子字符串的位置

描述

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

查找 needlehaystack 字符串中的最后一次出现的数字位置。

strrpos() 不同,strripos() 不区分大小写。

参数

haystack

要搜索的字符串。

needle

要搜索的字符串。

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

offset

如果为零或正数,则搜索将从左到右执行,跳过 haystack 的前 offset 个字节。

如果为负数,则搜索将从右到左执行,跳过 haystack 的最后 offset 个字节,并搜索 needle 的第一次出现。

注意:

这实际上是在查找最后 offset 个字节之前 needle 的最后一次出现。

返回值

返回 needlehaystack 字符串的开头(独立于搜索方向或偏移量)的位置。

注意: 字符串位置从 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 传递已被弃用。

示例

示例 #1 一个简单的 strripos() 示例

<?php
$haystack
= 'ababcd';
$needle = 'aB';

$pos = strripos($haystack, $needle);

if (
$pos === false) {
echo
"抱歉,我们在 ($haystack) 中没有找到 ($needle)";
} else {
echo
"恭喜!\n";
echo
"我们在 ($haystack) 中找到了最后一个 ($needle),位置为 ($pos)";
}
?>

上面的示例将输出

Congratulations!
   We found the last (aB) in (ababcd) at position (2)

参见

  • strpos() - 查找字符串中第一个子字符串的位置
  • stripos() - 查找字符串中第一个不区分大小写的子字符串的位置
  • strrpos() - 查找字符串中最后一个子字符串的位置
  • strrchr() - 查找字符串中最后一个字符的出现
  • stristr() - 不区分大小写的 strstr
  • substr() - 返回字符串的一部分

添加注释

用户贡献的注释 7 个注释

Yanik Lupien
17 年前
在 PHP 4 中实现此函数的简单方法

<?php
if (function_exists('strripos') == false) {
function
strripos($haystack, $needle) {
return
strlen($haystack) - strpos(strrev($haystack), $needle);
}
}

?>
dimmav at in dot gr
15 年前
假设你只需要一个反向工作的 stripos 函数,并期望 strripos 可以完成这项工作,那么你最好使用以下名为 strbipos 的自定义函数的代码

<?php
function strbipos($haystack="", $needle="", $offset=0) {
// 从 $offset 开始,在 $haystack 中反向搜索 $needle,并返回找到的位置或 false

$len = strlen($haystack);
$pos = stripos(strrev($haystack), strrev($needle), $len - $offset - 1);
return ( (
$pos === false) ? false : $len - strlen($needle) - $pos );
}

// 测试
$body = "01234Xy7890XYz456xy90";
$str = "xY";
$len = strlen($body);
echo
"TEST POSITIVE offset VALUES IN strbipos<br>";
for (
$i = 0; $i < $len; $i++) {
echo
"Search in [$body] for [$str] starting from offset [$i]: [" . strbipos($body, $str, $i) . "]<br>";
}
?>

请注意,此函数的执行结果与 PHP 5 中的 strripos 函数不同。
peev[dot]alexander at gmail dot com
16 年前
我认为您不应该低估 $needle 的长度,因为它在字符串中最后一次出现的第一个位置进行搜索。我改进了发布的函数,并添加了对偏移量的支持。我认为这是一个与实际函数完全相同的副本。

<?php
if(!function_exists("strripos")){
function
strripos($haystack, $needle, $offset=0) {
if(
$offset<0){
$temp_cut = strrev( substr( $haystack, 0, abs($offset) ) );
}
else{
$temp_cut = strrev( substr( $haystack, $offset ) );
}
$pos = strlen($haystack) - (strpos($temp_cut, strrev($needle)) + $offset + strlen($needle));
if (
$pos == strlen($haystack)) { $pos = 0; }
return
$pos;
}
/* endfunction strripos*/
}/* endfunction exists strripos*/
?>
Anonymous
13 年前
一般来说,线性搜索是从头到尾,而不是从尾到头——从人的角度来看这是有道理的。如果需要反向查找字符串,则反转目标字符串和匹配字符串,而不是手动将其拆分。
peev[dot]alexander at gmail dot com
16 年前
好的,我想这将是 PHP 4.x 版本的最终函数实现(我之前的帖子无效)

<?php

if(!function_exists("stripos")){
function
stripos( $str, $needle, $offset = 0 ){
return
strpos( strtolower( $str ), strtolower( $needle ), $offset );
}
/* endfunction stripos */
}/* endfunction exists stripos */

if(!function_exists("strripos")){
function
strripos( $haystack, $needle, $offset = 0 ) {
if( !
is_string( $needle ) )$needle = chr( intval( $needle ) );
if(
$offset < 0 ){
$temp_cut = strrev( substr( $haystack, 0, abs($offset) ) );
}
else{
$temp_cut = strrev( substr( $haystack, 0, max( ( strlen($haystack) - $offset ), 0 ) ) );
}
if( (
$found = stripos( $temp_cut, strrev($needle) ) ) === FALSE )return FALSE;
$pos = ( strlen( $haystack ) - ( $found + $offset + strlen( $needle ) ) );
return
$pos;
}
/* endfunction strripos */
}/* endfunction exists strripos */
?>
ElectroFox
17 年前
对不起,我之前发布的帖子有点仓促。简单的 php4 版本还有一个错误,它在字符串未找到时会中断。它实际上应该像这样

<?php
if (function_exists('strripos') == false) {
function
strripos($haystack, $needle) {
$pos = strlen($haystack) - strpos(strrev($haystack), strrev($needle));
if (
$pos == strlen($haystack)) { $pos = 0; }
return
$pos;
}
}
?>

注意,我们现在检查 $needle 是否已找到,如果没有找到,则返回 0。
admin at e-xxi dot net
14 年前
strripos() 在您提供搜索位置时有非常奇怪的行为。由于某些原因,它从给定位置向前搜索,而不是向后搜索,这更合乎逻辑。

例如,如果您想查找 $what 的实例,位于最后一个实例之前,strripos($where, $what, $last_what_pos-1) 将无法按预期工作。它会反复返回 $last_what_pos。这完全没有道理。

为了防止这种情况,我只使用 $prev_last_what_pos = strripos(substr($where,0,$last_what_pos), $what);
To Top