我正在使用函数 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”?
谢谢
简单的!因为它会在字符串中找到最后一次出现的字符。一言不发。
它只是找到最后一个出现的字符,然后它会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
从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
来自 PHP 文档:
haystack 要搜索的字符串
needle 如果 needle 包含多个字符,则仅使用第一个字符。此行为与 strstr() 的行为不同。
在您的示例中,仅使用针 (t) 的第一个字符