php - 替换字符串中的值
问题描述
我有一个字符串,其中包含一定数量的 #{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 变量中实际执行替换。任何帮助深表感谢!
解决方案
您可以使用以下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
关联数组中有一个带有数字键的项目,则整个匹配项将替换为相应的值。否则,将返回匹配项,这样就不会发生替换并且匹配项不会被删除。
推荐阅读
- java - 如何区分具有相同规则但范围不同(ANTLR 4)的声明变量?
- swift - 如何通过约束以编程方式在两个其他视图之间和下方添加一个居中的视图?迅速
- android - 为什么 minifyEnabled 在默认情况下在发布版本中为 false?
- django - InvalidQueryError:无法解析字段“点”MongoEngine
- c++ - 使用 OpenMP 在 C++ 中进行并行计算对经过的时间没有影响
- java - 如何在VScode的java类依赖中设置断点
- android - 在 searchView 中找不到新添加的股票
- azure - CORS 策略阻止 localhost 应用程序但不阻止 Postman
- azure-data-explorer - Kusto:从查询中摄取
- go - Google pubsub 死字在 golang 中不起作用