首页 > 解决方案 > 替换字符串中的值

问题描述

我有一个字符串,其中包含一定数量的 #{number} 结构。例如:

#328_#918_#1358
SKU:#666:#456
测试--#888/#982

对于每个 #{number} 结构,我必须用已知字符串替换它。

对于第一个示例:
#328_#918_#1358
我有以下字符串:

328="foo"
918="bar"
1358"arg"

结果应该是:
foo_bar_arg

我怎样才能达到这样的效果?我当前的代码如下所示:

$matches = array();
$replacements = array();
// starting string
$string = "#328_#918:#1358";
// getting all the numbers from the string
preg_match_all("/\#[0-9]+/", $string, $matches);
// getting rid of #
foreach ($matches[0] as $key => &$feature) {
    $feature = preg_replace("/#/", "", $feature);
} // end foreach
// obtaining the replacement values
foreach ($matches[0] as $key => $value) {
    $replacement[$value] = "fizz"; // here the value required for replacement is obtained
} // end foreach

但我不知道如何使用 $replacement 表中的值在 $string 变量中实际执行替换。任何帮助深表感谢!

标签: phpregex

解决方案


您可以使用以下preg_replace_callback解决方案:

$string = '#328_#918:#1358
SKU:#666:#456
TEST--#888/#982';
$replacements = [328=>"foo", 918=>"bar", 1358=>"arg"];
echo preg_replace_callback("/#([0-9]+)/", function ($m) use ($replacements) {
    return isset($replacements[$m[1]]) ? $replacements[$m[1]] : $m[0];
}
,$string);

请参阅PHP 演示

#([0-9]+)则表达式将在将所有非重叠出现的#和一个或多个数字捕获到组 1 后立即匹配它们。如果replacements关联数组中有一个带有数字键的项目,则整个匹配项将替换为相应的值。否则,将返回匹配项,这样就不会发生替换并且匹配项不会被删除。


推荐阅读