0

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

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

与要替换的字符串数量一样多?

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

4

2 回答 2

6

str_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'
于 2012-11-02T13:37:16.370 回答
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);
于 2012-11-02T13:51:12.743 回答