我想用字符串中的多个不同字符串替换不同的子字符串,有没有更好的方法来做而不是我做劳动和使用
str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
与要替换的字符串数量一样多?
例如:在任何示例字符串中分别a, b and c
替换为。d, e and f
当然我有大量的词要改变,我需要它。
我想用字符串中的多个不同字符串替换不同的子字符串,有没有更好的方法来做而不是我做劳动和使用
str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
与要替换的字符串数量一样多?
例如:在任何示例字符串中分别a, b and c
替换为。d, e and f
当然我有大量的词要改变,我需要它。
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'
这样做的通常方法是提供一系列翻译
$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);