在一个字符串中添加和前置文本。

3
我希望能够在字符串中搜索特定的单词,并在每个该单词实例前后添加字符。
例如:
I like cats, cats are awesome! I wish I had cats!

成为:

I like (cats), (cats) are awesome! I wish I had (cats)!

我知道可以使用

str_replace( 'cats', '(cats)', $string );

但我必须两次写“cats”。 我想要一个只需我写一次的方法。


你的意思是想要一个函数调用,像 str_wrap(needle,prefix,suffix,haystack) 这样吗?(顺便说一句,虽然可能有一个名为 str_wrap 的函数,但我并不是在说这是对它的调用格式,也不是函数的意图)。你能告诉我们为什么你不喜欢两次输入“cats”吗? - Jonathan M
2
把它放在一个变量里?你需要写两次变量名,但它们并不相同。 - Jon
3个回答

8
$search = 'cats';
preg_replace('/' . preg_quote($search, '/') . '/', '($0)', $string);

preg_replace文档改写而来:
替换字符串可以包含形式为$n的引用。每个这样的引用将被第n个括号模式捕获的文本替换。$0指的是整个模式匹配的文本。

6

@williammalo,你能告诉我们为什么你不想两次写“cats”吗?只是好奇。 - Jonathan M
@williammalo,请注意,与简单的str_replace()相比,使用正则表达式会消耗更多的CPU资源。 - Jonathan M
@JonathanM 我有一个巨大的纯文本值列表需要加括号,我想让编写代码更容易些。 - william malo
@williammalo,使用正则表达式进行替换可能会导致CPU负载过高。我在另一个答案中发布了一种可能的替代方案。 - Jonathan M
如果你明白模式标记sm的作用,你就不会使用它们了。不幸的是,研究人员将复制粘贴您的代码。应该使用其他答案中的任何一个。另外,没有人问及单词边界,这是需要澄清的必要区分。 - mickmackusa
@Andrew 页面的年龄对研究人员来说完全无关紧要。质量很重要,这样人们就不会在项目中使用错误的代码。您拥有数千个声望点,这意味着研究人员可以“信任”您提供好的东西。更重要的是,被接受的答案需要是“正确的”。 - mickmackusa

1
你的评论:

我有一个巨大的纯文本值列表需要用括号括起来,我想让编写代码更容易。

由于您将要进行许多替换(对于 CPU 来说很昂贵),而且您只是想缩短编码时间,为什么不通过包装 str_replace() 来节省CPU呢?
function str_wrap($needle,$prefix,$suffix,$haystack) {
    return str_replace($needle, $prefix . $needle . $suffix, $haystack);
}

根据PHP手册

如果您不需要复杂的替换规则(如正则表达式),您应该始终使用[str_replace()]而不是preg_replace()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接