我想要一个只替换$subject中第一次出现的$search的str_replace()版本。有没有一个简单的解决方案,或者我需要一个老套的解决方案?
发布于 2009-08-10 00:43:34
可以使用preg_replace完成
function str_replace_first($search, $replace, $subject)
{
$search = '/'.preg_quote($search, '/').'/';
return preg_replace($search, $replace, $subject, 1);
}
echo str_replace_first('abc', '123', 'abcdef abcdef abcdef');
// outputs '123def abcdef abcdef'神奇之处在于可选的第四个参数限制。从文档中:
限制-每个主题字符串中每个模式的最大可能替换数。默认为-1 (无限制)。
不过,请参阅zombat's answer以获得更有效的方法(大致快3-4倍)。
发布于 2009-08-10 00:46:32
它没有版本,但解决方案一点也不老套。
$pos = strpos($haystack, $needle);
if ($pos !== false) {
$newstring = substr_replace($haystack, $replace, $pos, strlen($needle));
}非常简单,并且节省了正则表达式的性能损失。
额外的好处:如果你想替换上次出现的代码,只需用strrpos代替strpos即可。
发布于 2010-04-09 18:28:39
编辑:两个答案都已更新,现在都是正确的。我将留下答案,因为函数计时仍然有用。
不幸的是,'zombat‘和'too much php’的答案是错误的。这是对zombat发布的答案的修改(因为我没有足够的名气来发表评论):
$pos = strpos($haystack,$needle);
if ($pos !== false) {
$newstring = substr_replace($haystack,$replace,$pos,strlen($needle));
}注意strlen($needle),而不是strlen($replace)。Zombat的例子只有在针和替换的长度相同的情况下才能正常工作。
下面是一个函数中的相同功能,其签名与PHP自己的str_replace相同:
function str_replace_first($search, $replace, $subject) {
$pos = strpos($subject, $search);
if ($pos !== false) {
return substr_replace($subject, $replace, $pos, strlen($search));
}
return $subject;
}这是修改后的答案“php太多”:
implode($replace, explode($search, $subject, 2));请注意末尾的2而不是1。或函数格式:
function str_replace_first($search, $replace, $subject) {
return implode($replace, explode($search, $subject, 2));
}我对这两个函数进行了计时,当找不到匹配项时,第一个函数的速度要快一倍。当找到匹配项时,它们的速度相同。
https://stackoverflow.com/questions/1252693
复制相似问题