PHP Conference Japan 2024

strripos

(PHP 5, PHP 7, PHP 8)

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

描述

strripos(字符串 $haystack, 字符串 $needle, 整数 $offset = 0): 整数|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 的最后一次出现。

返回值

返回 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 传递已弃用。

示例

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

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

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

if (
$pos === false) {
echo
"抱歉,我们在 ($needle) 中没有找到 ($haystack)";
} 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() - 返回字符串的一部分

添加注释

用户贡献的注释 6 个注释

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
16 年前
假设您只需要一个反向工作的 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
"在 [$body] 中搜索 [$str],从偏移量 [$i] 开始: [" . strbipos($body, $str, $i) . "]<br>";
}
?>

请注意,此函数完全按照其描述执行,其结果与 PHP 5 的 strripos 函数不同。
peev[dot]alexander at gmail dot com
17 年前
我认为在搜索字符串中最后一次出现的位置时,不应该低估 $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*/
?>
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 */
?>
匿名用户
14 年前
一般来说,线性搜索是从头到尾,而不是从尾到头——从人类的角度来看,这是有意义的。如果您需要反向查找字符串中的字符串,请反转您的 $haystack 和 $needle,而不是手动将其分割。
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。
To Top