在 PHP 4 中实现此函数的简单方法
<?php
if (function_exists('strripos') == false) {
function strripos($haystack, $needle) {
return strlen($haystack) - strpos(strrev($haystack), $needle);
}
}
?>
(PHP 5, PHP 7, PHP 8)
strripos — 查找字符串中不区分大小写的子字符串最后一次出现的的位置
haystack
要搜索的字符串。
needle
要搜索的字符串。
在 PHP 8.0.0 之前,如果 needle
不是字符串,则将其转换为整数并将其用作字符的序数值。此行为从 PHP 7.3.0 开始已弃用,并且强烈建议不要依赖它。根据预期的行为,needle
应该要么显式转换为字符串,要么执行对 chr() 的显式调用。
offset
如果为零或正数,则搜索将从左到右执行,跳过 haystack
的前 offset
个字节。
如果为负数,则搜索将从右到左执行,跳过 haystack
的最后 offset
个字节,并搜索 needle
的第一次出现。
注意:
这实际上是在查找最后
offset
个字节之前needle
的最后一次出现。
版本 | 描述 |
---|---|
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)
在 PHP 4 中实现此函数的简单方法
<?php
if (function_exists('strripos') == false) {
function strripos($haystack, $needle) {
return strlen($haystack) - strpos(strrev($haystack), $needle);
}
}
?>
假设您只需要一个反向工作的 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 函数不同。
我认为在搜索字符串中最后一次出现的位置时,不应该低估 $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*/
?>
好的,我想这将是 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 */
?>
一般来说,线性搜索是从头到尾,而不是从尾到头——从人类的角度来看,这是有意义的。如果您需要反向查找字符串中的字符串,请反转您的 $haystack 和 $needle,而不是手动将其分割。
抱歉,我之前发布的帖子有点草率。简单的 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。