在 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 | 不再支持将 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)
在 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 "Search in [$body] for [$str] starting from offset [$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 */
?>
对不起,我之前发布的帖子有点仓促。简单的 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。
strripos() 在您提供搜索位置时有非常奇怪的行为。由于某些原因,它从给定位置向前搜索,而不是向后搜索,这更合乎逻辑。
例如,如果您想查找 $what 的实例,位于最后一个实例之前,strripos($where, $what, $last_what_pos-1) 将无法按预期工作。它会反复返回 $last_what_pos。这完全没有道理。
为了防止这种情况,我只使用 $prev_last_what_pos = strripos(substr($where,0,$last_what_pos), $what);