我正在使用函数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"而不是#34;测试代码"?
由于
答案 0 :(得分:2)
简单!因为它在字符串中找到最后一个字符。不是一个字。
它只找到最后一个出现的字符,然后它将echo
该位置的其余字符串。{/ p>
在您的第一个示例中:
$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
答案 1 :(得分:1)
来自 PHP documentation :
针
如果针包含多个字符,仅使用第一个字符。这种行为是不同的 来自strstr()。
所以第一个例子与:
完全相同$text = 'This is my code';
echo strrchr($text, 'm');
<强> RESULT 强>
'This is my code'
^
'my code'
您的第二个示例与以下内容完全相同:
$text = 'This is a test to test code';
echo strrchr($text, 't');
<强> RESULT 强>
'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
答案 2 :(得分:-1)
来自PHP doc:
草堆 要搜索的字符串
针 如果针包含多个字符,则仅使用第一个字符。此行为与strstr()的行为不同。
在您的示例中,仅使用针(t)的第一个字符