PHP替换字符串中数组中所有键的出现次数

11

也许这是重复的问题,但我没有找到好的解决方案。

我有一个数组

$list = Array
(
   [hi] => 0
   [man] => 1
);
$string="hi man, how are you? man is here. hi again."

它应该产生 $final_string = "0 1, how are you? 1 is here. 0 again."

我该如何以聪明的方式实现它?非常感谢。


1
$newString = str_replace(array_keys($list), array_values($list), $string); 或者 $newString = strtr($string, $list); - Mark Baker
4个回答

23

就我个人的想法:

$find       = array_keys($list);
$replace    = array_values($list);
$new_string = str_ireplace($find, $replace, $string);

@MD.SahibBinMahboob,但它并不起作用,仍然存在一些错误,$keys 应该是 $replace - srain
@srain,你提到了一个很好的问题,即大小写敏感性。但是可以通过使用不区分大小写的版本str_ireplace()来轻松解决这个问题。 - John Conde
$replace = array_values($list); 这个调用 array_values 的操作是不必要的,你可以直接将 $list 数组传递给 str_replace 函数。 - Matthew

18
可以使用strtr()在一行代码中完成。
引用文档:
如果给定两个参数,第二个参数应该是一个形如array('from' => 'to', ...)的数组。返回的字符串中所有数组键的出现都会被对应值替换。最长的键将首先尝试。一旦替换了子字符串,它的新值就不会再次被搜索。
要获取修改后的字符串,只需执行以下操作:
$newString = strtr($string, $list);
这将输出:
0 1, how are you? 1 is here. 0 again.

演示。


4
为什么这个答案没有被采纳?这个函数的设计正是OP(和我)要寻找的。 - scipilot
3
@scipilot: 它是“西部最快的枪手”问题 :) - Amal Murali

2

非常简单且有效的解决方案。谢谢。 - jackJoe

1

preg_replace 可能会有帮助。

<?php
$list = Array
(
    'hi' => 0,
    'man' => 1
);
$string="hi man, how are you? Man is here. Hi again.";

$patterns = array();
$replacements = array();

foreach ($list as $k => $v)
{
    $patterns[] = '/' . $k . '/i';  // use i to ignore case
    $replacements[] = $v;
}
echo preg_replace($patterns, $replacements, $string);

我可能倾向于使用 array_map() 函数将键用分隔符包装起来,而不是使用 foreach() 循环;但它确实处理大小写敏感性;甚至可以调整以处理单词边界。 - Mark Baker

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