条件preg_replace

时间:2014-11-17 18:19:29

标签: php preg-replace

我有以下代码:

$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"

谢谢!

3 个答案:

答案 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;

Run it

答案 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);
});

这种方法的主要好处是你的字符串只被解析一次(而不是每个模式一次)