如何用 preg_replace 一个一个地替换另一个字符串

how to replace string with another one by one with preg_replace

我有这段代码,我的问题是如何使用 preg_replace 逐个替换字符串

$arr = ["{A}","{B}","{C}","{A}"];
$string = "{A}{B}{C}{A}";
foreach ($arr as $item){

    $replacement = "<span class=\"c\">{$item}</span>";
    $new_String = preg_replace("/$item/",$replacement ,$string);

}

结果是这样的:

<span class="c">
    <span class="c">{A}</span>
</span>

<span class="c">{B}</span>

<span class="c">{C}</span>

<span class="c">
    <span class="c">{A}</span>
</span>

因为我的字符串中有 2 个 {A} preg_replace 为两个 {A} 制作 2 个跨度。 如何解决这个问题?

您使用preg_replace的方式不对:这个函数的主要作用是将一个正则表达式模式作为参数,一个模式不是描述一个固定的字符串,而是可以描述几种字符串(这样你就不必使用 foreach 循环,因为你可以一次性替换整个字符串),例如:

$result = preg_replace('/{[A-G]}/', '<span class="c">[=10=]</span>', $string);

其他方式,因为你只想替换固定的字符串,你可以使用 strtr 也可以一次完成工作:

$arr = ["{A}","{B}","{C}"];
$rep = array_map(function($i) { return '<span class="c">' . $i . '</span>'; }, $arr);
$trans = array_combine($arr, $rep);

$result = strtr($string, $trans);

除了 Casimir 建议的片段外,您还可以使用以下片段:

代码:(Demo)

$arr   = ["{A}", "{B}", "{C}", "{A}"];
$start = '<span class="c">';
$end   = '</span>';
$string = "{A}{B}{C}{A}";

foreach (array_unique($arr) as $item) {
    $string = str_replace($item, $start . $item . $end, $string);
}

echo $string;

它改变了您定义替换的方式,但避免了正则表达式。

作为更强大的解决方案(如果您的项目需要),使用 strtr() 是对同一字符串进行多次替换的理想选择,因为它可以避免替换一个替换项。正如您在 Casimir 的回答中看到的那样,需要做一些准备工作。

这是卡西米尔技术的 language-construct 版本:(Demo)

$arr   = ["{A}", "{B}", "{C}", "{A}"];

foreach (array_unique($arr) as $item) {
    $translator[$item] = '<span class="c">' . $item . '</span>';
}

var_export($translator);
echo "\n\n---\n\n";

$string = "{A}{B}{C}{A}";

echo strtr($string, $translator);

输出:

array (
  '{A}' => '<span class="c">{A}</span>',
  '{B}' => '<span class="c">{B}</span>',
  '{C}' => '<span class="c">{C}</span>',
)

---

<span class="c">{A}</span><span class="c">{B}</span><span class="c">{C}</span><span class="c">{A}</span>