如何使用preg_replace将字符串替换为另一个字符串

时间:2019-07-16 17:13:59

标签: php regex 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>

因为我的字符串preg_replace中有2个{A},所以两个{A}的跨度均为2。 如何解决?

2 个答案:

答案 0 :(得分:1)

您使用preg_replace的方式是错误的:此函数的主要用途是将正则表达式模式作为参数,而模式不是描述固定字符串,而是可以描述几种字符串(并且这样,您不必使用foreach循环,因为您可以在1遍内替换整个字符串),例如:

$result = preg_replace('/{[A-G]}/', '<span class="c">$0</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);

答案 1 :(得分:0)

除了卡西米尔(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)的答案中看到的那样,需要做一些准备工作。

以下是卡西米尔技术的一种语言构造版本:(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>