用列数据替换括号内的字符串

时间:2013-04-25 08:20:30

标签: php regex preg-replace-callback

我编写了一些代码,允许对特定的数据列进行计算。

例如{1} * {2}会导致第1列乘以第2列。我需要做的是将这些数字替换为列的实际值。

简单地说,我需要能够在括号内获取值,然后像$ column [“括号中的值”]一样使用它来获取要插入到计算中的值。

然后我可以评估字符串。

提前致谢

2 个答案:

答案 0 :(得分:3)

这样的事情应该有效:

$myString = '{1}*{2}';
$myValues = [1 => '684', 2 => '42'];
$myFormula = preg_replace_callback('{([0-9]+)}', function($match) use ($myValues) {
  return $myValues[$match] ?: 'undefined';
}, $myString);
echo "Resulting formula: $myFormula";

当使用未定义的索引时,可能想要提出更难的错误,但实际上这应该适用于一些调整。

此外,如果您运行的PHP版本低于5.4,则需要重写短数组语法和lambda。

答案 1 :(得分:1)

PHP Rocks !!!

$string = 'blabla bla I want this to be done !!! {10} + {12} Ah the result is awesome but let\'s try something else {32} *    {54}';

// Requires PHP 5.3+
$string = preg_replace_callback('/\{(\d+(\.\d+)?)\}\s*([\+\*\/-])\s*\{(\d+(\.\d+)?)\}/', function($m){
return mathOp($m[3], $m[1], $m[4]);
}, $string);

echo $string; // blabla bla I want this to be done !!! 22 Ah the result is awesome but let's try something else 1728

// function from: http://stackoverflow.com/a/15434232
function mathOp($operator, $n1, $n2){
    if(!is_numeric($n1) || !is_numeric($n2)){
        return 'Error: You must use numbers';
    }
    switch($operator){
        case '+':
            return($n1 + $n2);
        case '-':
            return($n1 - $n2);
        case '*':
            return($n1 * $n2);
        case '/':
            if($n2 == 0){
                return 'Error: Division by zero';
            }else{
                return($n1 / $n2);
            }
        default:
            return 'Unknown Operator detected';
    }
}

Online demo