我有以下代码:
$formula = "E1 + E2 + E4 + E5 + E7 + E8 + E10 + E11";
$patterns = array('Se' => '@Se@',
'Et' => '@Et@',
'E1' => '@E1@',
'E2' => '@E2@');
$values = array('Se' => 9,
'Et' => 12,
'E1' => 1,
'E2' => 8);
$replaced = preg_replace($patterns, $values, $formula);
echo $replaced;
"1 + 8 + E4 + E5 + E7 + E8 + 10 + 11"
我需要一个只替换E1的代码,并忽略E10和E11,在这种情况下显示以下结果:"1 + 8 + E4 + E5 + E7 + E8 + E10 + E11"
谢谢!
答案 0 :(得分:0)
你可以使用这种模式
"/E1[^0-9]/"
答案 1 :(得分:0)
<?php
$formula = "E1 + E2 + E4 + E5 + E7 + E8 + E10 + E11";
$patterns = array('@\bSe\b@',
'@\bEt\b@',
'@\bE1\b@',
'@\bE2\b@');
$values = array(9, 12, 1, 8);
$replaced = preg_replace($patterns, $values, $formula);
echo $replaced;
输出:
1 + 8 + E4 + E5 + E7 + E8 + E10 + E11
编辑。您的代码经过重构以便更好地阅读:
<?php
$formula = "E1 + E2 + E4 + E5 + E7 + E8 + E10 + E11";
$map = array(
'Se' => 9,
'Et' => 12,
'E1' => 1,
'E2' => 8,
);
$patterns = array_keys($map);
$patterns = array_map(function ($v) { return "/\b$v\b/"; }, $patterns);
$values = array_values($map);
$replaced = preg_replace($patterns, $values, $formula);
echo $replaced;
答案 2 :(得分:0)
另一种方法:
$values = array('Se' => 9,
'Et' => 12,
'E1' => 1,
'E2' => 8);
$formula = "E1 + E2 + E4 + E5 + E7 + E8 + E10 + E11";
$formulaArray = preg_split('~\b~', $formula);
$formula = array_reduce($formulaArray, function ($c, $i) use ($values) {
return $c . (isset($values[$i]) ? $values[$i] : $i);
});
这种方法的主要好处是你的字符串只被解析一次(而不是每个模式一次)。