如何用 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>
我有这段代码,我的问题是如何使用 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>