我想的一个版本str_replace()是只替换第一次出现$search的$subject.有一个简单的解决方案,还是我需要一个hacky解决方案?
zom*_*bat 562
没有它的版本,但解决方案根本不是hacky.
$pos = strpos($haystack, $needle);
if ($pos !== false) {
$newstring = substr_replace($haystack, $replace, $pos, strlen($needle));
}
Run Code Online (Sandbox Code Playgroud)
非常简单,并且可以节省正则表达式的性能损失.
额外奖励:如果您想要替换最后一次出现,只需使用strrpos代替strpos.
kar*_*m79 321
可以用preg_replace完成:
function str_replace_first($from, $to, $content)
{
$from = '/'.preg_quote($from, '/').'/';
return preg_replace($from, $to, $content, 1);
}
echo str_replace_first('abc', '123', 'abcdef abcdef abcdef');
// outputs '123def abcdef abcdef'
Run Code Online (Sandbox Code Playgroud)
神奇的是可选的第四个参数[Limit].从文档:
[Limit] - 每个主题字符串中每个模式的最大可能替换.默认为-1(无限制).
但是,请参阅zombat的答案,以获得更有效的方法(大约快3-4倍).
Bas*_*Bas 94
编辑:两个答案都已更新,现在是正确的.我会留下答案,因为功能时间仍然有用.
遗憾的是,'zombat'和'太多php'的答案都不正确.这是对zombat发布的答案的修订(因为我没有足够的声誉来发表评论):
$pos = strpos($haystack,$needle);
if ($pos !== false) {
$newstring = substr_replace($haystack,$replace,$pos,strlen($needle));
}
Run Code Online (Sandbox Code Playgroud)
请注意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;
}
Run Code Online (Sandbox Code Playgroud)
这是"太多PHP"的修订答案:
implode($replace, explode($search, $subject, 2));
Run Code Online (Sandbox Code Playgroud)
注意结尾2而不是1.或者在函数格式中:
function str_replace_first($search, $replace, $subject) {
return implode($replace, explode($search, $subject, 2));
}
Run Code Online (Sandbox Code Playgroud)
我将两个函数计时,第一个函数在没有找到匹配时快两倍.找到匹配时速度相同.
oLi*_*ent 72
我想知道哪一个是最快的,所以我测试了它们.
您将在下面找到:
所有功能都使用相同的设置进行测试:
$string = 'OOO.OOO.OOO.S';
$search = 'OOO';
$replace = 'B';
Run Code Online (Sandbox Code Playgroud)
仅替换字符串中第一次出现的字符串的函数:
substr_replace($string, $replace, 0, strlen($search));
[CONTRIBUTED BY] => zombat
[OOO.OOO.OOO.S] => B.OOO.OOO.S
[AVERAGE TIME] => 0.0000062883
[SLOWER BY] => FASTEST
Run Code Online (Sandbox Code Playgroud)replace_first($search, $replace, $string);
[CONTRIBUTED BY] => too much php
[OOO.OOO.OOO.S] => B.OOO.OOO.S
[AVERAGE TIME] => 0.0000073902
[SLOWER BY] => 17.52%
Run Code Online (Sandbox Code Playgroud)preg_replace($search, $replace, $string, 1);
[CONTRIBUTED BY] => karim79
[OOO.OOO.OOO.S] => B.OOO.OOO.S
[AVERAGE TIME] => 0.0000077519
[SLOWER BY] => 23.27%
Run Code Online (Sandbox Code Playgroud)str_replace_once($search, $replace, $string);
[CONTRIBUTED BY] => happyhardik
[OOO.OOO.OOO.S] => B.OOO.OOO.S
[AVERAGE TIME] => 0.0000082286
[SLOWER BY] => 30.86%
Run Code Online (Sandbox Code Playgroud)str_replace_limit($search, $replace, $string, $count, 1);
[CONTRIBUTED BY] => bfrohs - expanded renocor
[OOO.OOO.OOO.S] => B.OOO.OOO.S
[AVERAGE TIME] => 0.0000083342
[SLOWER BY] => 32.54%
Run Code Online (Sandbox Code Playgroud)str_replace_limit($search, $replace, $string, 1);
[CONTRIBUTED BY] => renocor
[OOO.OOO.OOO.S] => B.OOO.OOO.S
[AVERAGE TIME] => 0.0000093116
[SLOWER BY] => 48.08%
Run Code Online (Sandbox Code Playgroud)str_replace_limit($string, $search, $replace, 1, 0);
[CONTRIBUTED BY] => jayoaK
[OOO.OOO.OOO.S] => B.OOO.OOO.S
[AVERAGE TIME] => 0.0000093862
[SLOWER BY] => 49.26%
Run Code Online (Sandbox Code Playgroud)仅替换字符串中最后一次出现的字符串的函数:
substr_replace($string, $replace, strrpos($string, $search), strlen($search));
[CONTRIBUTED BY] => oLinkSoftware - modified zombat
[OOO.OOO.OOO.S] => OOO.OOO.B.S
[AVERAGE TIME] => 0.0000068083
[SLOWER BY] => FASTEST
Run Code Online (Sandbox Code Playgroud)strrev(implode(strrev($replace), explode(strrev($search), strrev($string), 2)));
[CONTRIBUTED BY] => oLinkSoftware
[OOO.OOO.OOO.S] => OOO.OOO.B.S
[AVERAGE TIME] => 0.0000084460
[SLOWER BY] => 24.05%
Run Code Online (Sandbox Code Playgroud)too*_*php 54
不幸的是,我不知道任何PHP功能可以做到这一点.
你可以像这样轻松地自己滚动:
function replace_first($find, $replace, $subject) {
// stolen from the comments at PHP.net/str_replace
// Splits $subject into an array of 2 items by $find,
// and then joins the array with $replace
return implode($replace, explode($find, $subject, 2));
}
Run Code Online (Sandbox Code Playgroud)
我创建了这个小函数,用字符串(区分大小写)替换字符串,不需要Regexp.它工作正常.
function str_replace_limit($search, $replace, $string, $limit = 1) {
$pos = strpos($string, $search);
if ($pos === false) {
return $string;
}
$searchLen = strlen($search);
for ($i = 0; $i < $limit; $i++) {
$string = substr_replace($string, $replace, $pos, $searchLen);
$pos = strpos($string, $search);
if ($pos === false) {
break;
}
}
return $string;
}
Run Code Online (Sandbox Code Playgroud)
用法示例:
$search = 'foo';
$replace = 'bar';
$string = 'foo wizard makes foo brew for evil foo and jack';
$limit = 2;
$replaced = str_replace_limit($search, $replace, $string, $limit);
echo $replaced;
// bar wizard makes bar brew for evil foo and jack
Run Code Online (Sandbox Code Playgroud)
小智 6
$str = "/property/details&id=202&test=123#tab-6p";
$position = strpos($str,"&");
echo substr_replace($str,"?",$position,1);
Run Code Online (Sandbox Code Playgroud)
使用 substr_replace 我们可以仅替换字符串中第一个字符的出现。as & 重复多次,但仅在第一个位置我们必须将 & 替换为 ?
=> 代码已修订,因此请考虑一些注释太旧
感谢大家帮助我改进这一点
有任何BUG请联系我;我会立即解决这个问题
那么,让我们继续:
将第一个“o”替换为“ea”,例如:
$s='I love you';
$s=str_replace_first('o','ea',$s);
echo $s;
//output: I leave you
Run Code Online (Sandbox Code Playgroud)
功能:
function str_replace_first($this,$that,$s)
{
$w=strpos($s,$this);
if($w===false)return $s;
return substr($s,0,$w).$that.substr($s,$w+strlen($this));
}
Run Code Online (Sandbox Code Playgroud)