替换字符串中的不同子字符串

时间:2012-11-02 13:35:28

标签: php

我想用字符串中的多个不同字符串替换不同的子字符串,是否有更好的方法而不是我的劳动和使用

str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )

要替换的字符串数量是多少次?

例如:在任何示例字符串中分别用a, b and c替换d, e and f。 当然,我有大量的词要改变,我需要它。

2 个答案:

答案 0 :(得分:6)

str_replace()接受一个搜索和替换参数的数组,因此您可以在数组中传递几个字符串进行搜索,并将替换为replace参数中传递的数组中的相应字符串,如下所示:

$search = array('a','b','c');
$replace = array('d','e','f');

$res = str_replace($search, $replace, 'a b cool');
echo $res; //echoes 'd e fool'

答案 1 :(得分:0)

通常的做法是提供一系列翻译

$xlat = array(
    'a' => 'd',
    'b' => 'e',
    'c' => 'f',
);

然后将其传递给str_replace

$result = str_replace(array_keys($xlat), array_values($xlat), $source);

您可以从SQL查询或其他来源构建数组。

如果源和替换字符串集之间存在交集,或源字符串之间存在内部匹配,则必须小心,例如

  'Alpha'  => 'Beta',
  'Beta'   => 'Gamma',

甚至更偷偷摸摸,

  'Alpha'    => 'Beta',
  'Alphabet' => 'ABCDEFGHIJ',

因为内部str_replace使用循环,因此“Base Alpha”将显示为“Base Gamma”,而“Alphabet”将显示为“Betabet”而不是“ABCDEFGHIJ”。处理此问题的一种可能方法是逐步构建$xlat;如果你发现新夫妻'a'=> 'b','a'已经在$xlat的值中,您可以推送到$xlat而不是追加。当然,更复杂的关键字集(甚至两个或更多术语的交换)可能无法解决。

另一种方法是在两次运行中执行此操作:首先生成表单的$xlat1数组

 'a' => '###<UNIQUEID1>###',
 'b' => '###<UNIQUEID2>###',

和表格的第二个数组

 '###<UNIQUEID1>###' => 'c',
 '###<UNIQUEID2>###' => 'd',

您可以使用循环将第一个单数组表单“升级”为第二个:

 // First step, we sort $xlat in order of decreasing key size.
 // This ensures that *Alphabet* will be replaced before *Alpha* is ever checked.

 // Then we build
 foreach($xlat as $from => $to)
 {
     $id = uniqid();
     $xlat1[$from] = $id;
     $xlat2[$id]   = $to;
 }
 $temp = str_replace(array_keys($xlat1), array_values($xlat1), $source);
 $result = str_replace(array_keys($xlat2), array_values($xlat2), $temp);