PHP Conference Japan 2024

strrchr

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

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

描述

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

此函数返回 haystack 的一部分,该部分从 needle 最后一次出现的位置开始,一直到 haystack 的末尾。

参数

haystack

要搜索的字符串

needle

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

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

before_needle

如果为 truestrrchr() 返回 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() - 查找子字符串在字符串中最后一次出现的 位置

添加注释

用户贡献的注释 8 条注释

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字符,包括最后一个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
[email protected]
20年前
[email protected]提供的函数并非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
[email protected]
18 年前
致:[email protected]

代码运行良好,但是当我尝试剪切脚本名称(例如:$_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
[email protected]
18 年前
[email protected]

我必须稍微更改一下你的函数,才能使其返回完整的needle(包含needle)。

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

// 返回$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
0
[email protected]
21年前
<?

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

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

}

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

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

?>
-5
[email protected]
19年前
我使用了[email protected]的反向strrchr,并将其简化为一行代码,并修复了它的功能——真正的strrchr()如果找不到needle则返回FALSE,而不是haystack :)

<?php
// strrchr()的反向
function reverse_strrchr($haystack, $needle)
{
return
strrpos($haystack, $needle) ? substr($haystack, 0, strrpos($haystack, $needle) +1 ) : false;
}
?>
To Top