我有这段代码,我的问题是如何使用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。 如何解决?
答案 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>