strrchr

(PHP 4, PHP 5, PHP 7, PHP 8)

strrchr在字符串中查找字符的最后一次出现

描述

strrchr(string $haystack, string $needle, bool $before_needle = false): string|false

此函数返回从 haystackneedle 最后一次出现的字符开始到 haystack 末尾的部分。

参数

haystack

要搜索的字符串

needle

如果 needle 包含多个字符,则只使用第一个字符。此行为不同于 strstr() 的行为。

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

before_needle

如果为 true,则 strrchr() 返回 haystackneedle 最后一次出现之前的部分(不包括 needle)。

返回值

此函数返回字符串的一部分,或者如果未找到 needle,则返回 false

更改日志

版本 描述
8.3.0 添加了 before_needle 参数。
8.0.0 needle 现在接受空字符串。
8.0.0 不再支持将 int 作为 needle 传递。
7.3.0 int 作为 needle 传递已被弃用。

示例

示例 #1 strrchr() 示例

<?php
$ext
= strrchr('somefile.txt', '.');
echo
"文件扩展名: $ext \n";
$ext = $ext ? strtolower(substr($ext, 1)) : '';
echo
"文件扩展名: $ext";
?>

上面的示例将输出类似于以下的内容

file extension: .txt
file extension: txt

注释

注意: 此函数是二进制安全的。

参见

  • strstr() - 查找字符串的第一次出现
  • strrpos() - 查找子字符串在字符串中的最后一次出现的字位置

添加注释

用户贡献的注释 10 个注释

31
matthewkastor at live dot com
13 年前
<?php
/**
* 删除字符串相对于指定字符最后一次出现的前面或后面的部分。
* 可以保留或丢弃选定的字符。
*
* 示例用法:
* <code>
* $example = 'http://example.com/path/file.php';
* $cwd_relative[] = cut_string_using_last('/', $example, 'left', true);
* $cwd_relative[] = cut_string_using_last('/', $example, 'left', false);
* $cwd_relative[] = cut_string_using_last('/', $example, 'right', true);
* $cwd_relative[] = cut_string_using_last('/', $example, 'right', false);
* foreach($cwd_relative as $string) {
* echo "$string <br>".PHP_EOL;
* }
* </code>
*
* 输出:
* <code>
* http://example.com/path/
* http://example.com/path
* /file.php
* file.php
* </code>
*
* @param string $character 要搜索的字符。
* @param string $string 要搜索的字符串。
* @param string $side 确定返回字符左侧或右侧的文本。
* 选项是:left 或 right。
* @param bool $keep_character 确定是否保留字符。
* 选项是:true 或 false。
* @return string
*/
function cut_string_using_last($character, $string, $side, $keep_character=true) {
$offset = ($keep_character ? 1 : 0);
$whole_length = strlen($string);
$right_length = (strlen(strrchr($string, $character)) - 1);
$left_length = ($whole_length - $right_length - 1);
switch(
$side) {
case
'left':
$piece = substr($string, 0, ($left_length + $offset));
break;
case
'right':
$start = (0 - ($right_length + $offset));
$piece = substr($string, $start);
break;
default:
$piece = false;
break;
}
return(
$piece);
}
?>
12
sekati at gmail dot com
18 年前
只是对 carlos dot lage at gmail dot com 注释的小小补充,使其更加有用和灵活

<?php
// 返回字符串中最后一次出现 needle 之前的所有内容
// 使用 $trail 来包含最后一个 needle 字符,包括和之后的字符
function reverse_strrchr($haystack, $needle, $trail) {
return
strrpos($haystack, $needle) ? substr($haystack, 0, strrpos($haystack, $needle) + $trail) : false;
}
// 用法:
$ns = (reverse_strrchr($_SERVER["SCRIPT_URI"], "/", 0));
$ns2 = (reverse_strrchr($_SERVER["SCRIPT_URI"], "/", 1));
echo(
$ns . "<br>" . $ns2);
?>
6
dchris1 at bigpond dot net dot au
20 年前
marcokonopacki at hotmail dot com 提供的函数并不是 strrchr() 的反向版本,而是 strchr() 的反向版本。它返回从 $haystack 开始到 $needle 第一次出现的所有内容。这基本上是您对 strchr() 预期的行为的反向。strrchr() 的反向版本将返回 $haystack 中到 $needle 最后一次出现的所有内容,例如

<?php
// 反转 strrchr() - PHP v4.0b3 及更高版本
function reverse_strrchr($haystack, $needle)
{
$pos = strrpos($haystack, $needle);
if(
$pos === false) {
return
$haystack;
}
return
substr($haystack, 0, $pos + 1);
}
?>

请注意,由于 strrpos() 的返回值类型('0' 不一定等于 'false'),此函数需要略微修改才能与 4.0b3 之前的 PHP 版本一起使用。有关更多信息,请查看 strrpos() 的文档。

这样的函数可以用于提取脚本的路径,例如

<?
$string = "/path/to/the/file/filename.php";

echo reverse_strrchr($string, '/'); // 将输出 "/path/to/the/file/"
?>
6
readless at gmx dot net
18 年前
to: repley at freemail dot it

代码运行良好,但我尝试切割脚本名称(例如:$_SERVER["SCRIPT_NAME"] => /index.php,在 "/" 处切割字符串并返回 "index.php")时,它什么也没返回(false)。我修改了你的代码,现在它也能在 needle 是第一个字符的情况下正常工作。
- 来自德国的问候

<?php
//strxchr(string haystack, string needle [, bool int leftinclusive [, bool int rightinclusive ]])
function strxchr($haystack, $needle, $l_inclusive = 0, $r_inclusive = 0){
if(
strrpos($haystack, $needle)){
// $haystack 中最后一次出现 $needle 之前的全部内容。
$left = substr($haystack, 0, strrpos($haystack, $needle) + $l_inclusive);

// 将 $r_inclusive 的值从 0 切换到 1 反之亦然。
$r_inclusive = ($r_inclusive == 0) ? 1 : 0;

// $haystack 中最后一次出现 $needle 之后的全部内容。
$right = substr(strrchr($haystack, $needle), $r_inclusive);

// 将 $left 和 $right 返回到数组中。
return array($left, $right);
} else {
if(
strrchr($haystack, $needle)) return array('', substr(strrchr($haystack, $needle), $r_inclusive));
else return
false;
}
}
?>
4
freakinunreal at hotmail dot com
18 年前
to marcokonopacki at hotmail dot com.

我必须对你的函数进行一些小的更改,才能让它返回包含完整的 needle。

// 反转搜索 strrchr。
function strrrchr($haystack,$needle)
{

// 返回 $needle 之前的所有内容(包含)。
//return substr($haystack,0,strpos($haystack,$needle)+1);
// 变为
return substr($haystack,0,strpos($haystack,$needle)+strlen($needle));
}

注意:+1 变为 +strlen($needle)

否则它只会返回 needle 中的第一个字符反向。
7
Primo Anderson Do S?tio
19 年前
$filename = 'strrchr_test.php';
print strrchr( $filename, '.' );

结果
.php

$other_filename = 'strrchr_test.asp.php';
print strrchr( $other_filename, '.' );

结果
.php
1
marcokonopacki at hotmail dot com
21 年前
<?

// 反转搜索 strrchr。
function strrrchr($haystack,$needle)
{

// 返回 $needle 之前的所有内容(包含)。
return substr($haystack,0,strpos($haystack,$needle)+1);

}

$string = "FIELD NUMBER(9) NOT NULL";

echo strrrchr($string,")"); // 将输出 FIELD (9)

?>
-4
carlos dot lage at gmail dot com
19 年前
我使用了 dchris1 at bigpond dot net dot au 的反转 strrchr 并将其简化为一行代码并修复了它的功能 - 真实的 strrchr() 在找不到 needle 时会返回 FALSE,而不是 haystack :)

<?php
// 反转 strrchr()
function reverse_strrchr($haystack, $needle)
{
return
strrpos($haystack, $needle) ? substr($haystack, 0, strrpos($haystack, $needle) +1 ) : false;
}
?>
-5
andfarm at thibs dot menloschool dot org
21 年前
strrchr 也非常适合查找文件的扩展名。例如

$ext = strrchr($filename, ".");

如果文件有扩展名,$ext 将包含文件的扩展名,包括 ".",如果没有扩展名,则为 FALSE。如果文件有多个扩展名,例如 "evilfile.jpg.vbs",则此构造将只返回最后一个扩展名。
-10
alex_bb23 at yahoo.co.uk
7 年前
我认为从字符串中提取一部分的好方法(我不知道是不是最好的方法)
<?php

$image
= "image.name.jpg";
// 获取文件扩展名
preg_replace("/.*\.(.*)$/", "$1", $last);
// 将得到:jpg

?>

比 substr(strrchr... 快
To Top