【问题标题】:php replace all occurances of key from array in stringphp替换字符串中数组中所有出现的键
【发布时间】:2013-12-06 05:46:02
【问题描述】:

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

我有数组

$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."

我怎样才能以聪明的方式实现它?非常感谢。

【问题讨论】:

  • $newString = str_replace(array_keys($list), array_values($list), $string);$newString = strtr($string, $list);

标签: php replace


【解决方案1】:

在我的头顶上:

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

【讨论】:

  • @MD.SahibBinMahboob,但它不起作用,仍然有些错误,$keys 应该是$replace
  • @srain 您在区分大小写方面提出了很好的观点。但这很容易通过使用str_replace()str_ireplace()的不区分大小写版本来解决
  • $replace = array_values($list); 不需要调用array_values,您只需将$list 数组传递给str_replace
【解决方案2】:

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() 循环来包装键;但它确实处理区分大小写;甚至可以调整以处理单词边界
【解决方案3】:

可以使用strtr() 在一行中完成。

引用文档:

如果给定两个参数,第二个应该是array('from' =&gt; 'to', ...) 形式的数组。返回值是一个字符串,其中所有出现的数组键都已替换为相应的值。最长的键将首先被尝试。一旦一个子字符串被替换,它的新值将不再被搜索。

要获取修改后的字符串,您只需:

$newString = strtr($string, $list);

这将输出:

0 1, how are you? 1 is here. 0 again.

Demo.

【讨论】:

  • 为什么这不是公认的答案?此功能旨在完成 OP(和我)正在寻找的功能。
  • @scipilot: 这是The Fastest Gun in the West 问题:)
【解决方案4】:
$text = strtr($text, $array_from_to)

http://php.net/manual/en/function.strtr.php

【讨论】:

  • 非常简单的解决方案,效果很好。谢谢。
猜你喜欢
  • 2012-08-01
  • 2021-12-27
  • 2023-03-09
  • 2013-04-15
  • 2022-11-21
  • 2017-03-20
  • 2017-05-17
  • 2011-06-30
  • 2014-08-05
相关资源
最近更新 更多