6

我正在使用函数 strrchr 进行一些测试,但我无法理解输出:

$text = 'This is my code';
echo strrchr($text, 'my');
//my code

好的,函数返回上次出现之前的字符串

$text = 'This is a test to test code';
echo strrchr($text, 'test');
//t code

但在这种情况下,为什么函数返回“t code”,而不是“test code”?

谢谢

4

3 回答 3

2

简单的!因为它会在字符串中找到最后一次出现的字符。一言不发。

它只是找到最后一个出现的字符,然后它会echo从该位置找到字符串的其余部分。


在您的第一个示例中:

$text = 'This is my code';
echo strrchr($text, 'my');

它找到最后一个m,然后打印包含m自身的重置:my code

在您的第二个示例中:

$text = 'This is a test to test code';
echo strrchr($text, 'test');

它找到最后一个t,并且像最后一个示例一样打印其余部分:test code

更多信息

于 2014-09-28T21:50:56.783 回答
1

PHP 文档

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


因此,您的第一个示例与以下示例完全相同:

$text = 'This is my code';
echo strrchr($text, 'm');

结果

'This is my code'
         ^
        'my code'

您的第二个示例与以下示例完全相同:

$text = 'This is a test to test code';
echo strrchr($text, 't');

结果

'This is a test to test code'
                      ^
                     't code'

我制作的这个功能可以满足您的期望:

/**
 * Give the last occurrence of a string and everything that follows it
 * in another string
 * @param  String $needle   String to find
 * @param  String $haystack Subject
 * @return String           String|empty string
 */
function strrchrExtend($needle, $haystack)
{
    if (preg_match('/(('.$needle.')(?:.(?!\2))*)$/', $haystack, $matches))
        return $matches[0];
    return '';
}

它使用的正则表达式可以在这里测试:DEMO

示例

echo strrchrExtend('test', 'This is a test to test code');

输出

test code
于 2014-09-28T22:03:39.117 回答
0

来自 PHP 文档:

haystack 要搜索的字符串

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

在您的示例中,仅使用针 (t) 的第一个字符

于 2014-09-28T21:50:42.597 回答