首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否使用str_replace使其仅在第一个匹配时起作用?

是否使用str_replace使其仅在第一个匹配时起作用?
EN

Stack Overflow用户
提问于 2009-08-10 00:39:55
回答 22查看 292.8K关注 0票数 371

我想要一个只替换$subject中第一次出现的$searchstr_replace()版本。有没有一个简单的解决方案,或者我需要一个老套的解决方案?

EN

回答 22

Stack Overflow用户

回答已采纳

发布于 2009-08-10 00:43:34

可以使用preg_replace完成

代码语言:javascript
运行
复制
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倍)。

票数 386
EN

Stack Overflow用户

发布于 2009-08-10 00:46:32

它没有版本,但解决方案一点也不老套。

代码语言:javascript
运行
复制
$pos = strpos($haystack, $needle);
if ($pos !== false) {
    $newstring = substr_replace($haystack, $replace, $pos, strlen($needle));
}

非常简单,并且节省了正则表达式的性能损失。

额外的好处:如果你想替换上次出现的代码,只需用strrpos代替strpos即可。

票数 712
EN

Stack Overflow用户

发布于 2010-04-09 18:28:39

编辑:两个答案都已更新,现在都是正确的。我将留下答案,因为函数计时仍然有用。

不幸的是,'zombat‘和'too much php’的答案是错误的。这是对zombat发布的答案的修改(因为我没有足够的名气来发表评论):

代码语言:javascript
运行
复制
$pos = strpos($haystack,$needle);
if ($pos !== false) {
    $newstring = substr_replace($haystack,$replace,$pos,strlen($needle));
}

注意strlen($needle),而不是strlen($replace)。Zombat的例子只有在针和替换的长度相同的情况下才能正常工作。

下面是一个函数中的相同功能,其签名与PHP自己的str_replace相同:

代码语言:javascript
运行
复制
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太多”:

代码语言:javascript
运行
复制
implode($replace, explode($search, $subject, 2));

请注意末尾的2而不是1。或函数格式:

代码语言:javascript
运行
复制
function str_replace_first($search, $replace, $subject) {
    return implode($replace, explode($search, $subject, 2));
}

我对这两个函数进行了计时,当找不到匹配项时,第一个函数的速度要快一倍。当找到匹配项时,它们的速度相同。

票数 99
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1252693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档