繁体   English   中英

替换字符串中的值

[英]Replacing values in string

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

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

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

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

328 =“富”
918="酒吧"
第1358章

结果应该是:
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 变量中实际执行替换。 任何帮助深表感谢!

您可以使用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关联数组中有一个带有数字键的项目,则整个match 被替换为相应的值。 否则,将返回匹配项,这样就不会发生替换并且匹配项不会被删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM