Php preg_用匿名函数替换_回调

Php preg_用匿名函数替换_回调,php,eval,anonymous-function,preg-replace-callback,Php,Eval,Anonymous Function,Preg Replace Callback,我收到了这个错误,但我无法找出原因: 分析错误:语法错误,C:\wamp\www\test.php19中意外的$end:第1行的求值代码 如有任何见解,将不胜感激 $table = '<table><tr><td>${Q*10}</td></tr></table>'; $symbols = array('Q' => 10); preg_replace_callback('/\${(\w+)([*+-\/])(\d+

我收到了这个错误,但我无法找出原因:

分析错误:语法错误,C:\wamp\www\test.php19中意外的$end:第1行的求值代码

如有任何见解,将不胜感激

$table = '<table><tr><td>${Q*10}</td></tr></table>';

$symbols = array('Q' => 10);

preg_replace_callback('/\${(\w+)([*+-\/])(\d+)}/', function($matches) use ($symbols, $table) {
    return repl($matches, $symbols, $table); 
}, $table);

function repl($tokens, $symbols, $table)
{
    $replace = array_shift($tokens);

    $operand1 = $symbols[$tokens[0]];
    $operator = $tokens[1];
    $operand2 = $tokens[2];

    $val = eval("$operand1 $operator $operand2");
    // Fix: $val = eval("return $operand1 $operator $operand2;");

    $table = str_replace($replace, $val, $table);

    echo $table; // Should be 100
}

// EOF

尝试在求值字符串末尾添加分号。

尝试在求值字符串末尾添加分号。

需要包含语句或语句块,而不仅仅是表达式

要实际获得结果并进行分配,您需要:

    $val = eval("return $operand1 $operator $operand2;");
正如@ggtenberg所说,至少分号可以避免语法错误。但是回到你想做的事情

$matches列表将包含位置[0]处的完整字符串。捕获组从[1]开始。您可能需要调整回调中的$tokens分配。

需要包含语句或语句块,而不仅仅是表达式

要实际获得结果并进行分配,您需要:

    $val = eval("return $operand1 $operator $operand2;");
正如@ggtenberg所说,至少分号可以避免语法错误。但是回到你想做的事情


$matches列表将包含位置[0]处的完整字符串。捕获组从[1]开始。您可能需要调整回调中的$tokens分配。

您确实应该使用switch语句而不是eval。此外,还应在[*+-\/]中转义连字符。在[]内表示从+到\`*。也可以将其作为括号中的最后一个字符。此外,鉴于您正在使用数学运算符,第一个和最后一个捕获应该仅为数字,即\d+`而不是\w+。感谢您对正则表达式的评论。我可能最终会使用一个开关-我认为问题出在匿名函数上,而不是eval。第一个操作数实际上只是$symbols数组的索引,但第二个操作数始终是数字。你真的应该使用switch语句而不是eval。此外,还应在[*+-\/]中转义连字符。在[]内表示从+到\`*。也可以将其作为括号中的最后一个字符。此外,鉴于您正在使用数学运算符,第一个和最后一个捕获应该仅为数字,即\d+`而不是\w+。感谢您对正则表达式的评论。我可能最终会使用一个开关-我认为问题出在匿名函数上,而不是eval。第一个操作数实际上只是$symbols数组的索引,但第二个操作数始终是数字。这一建议使我的代码工作正常。另外,我在repl函数中使用了array_shift好的,现在就开始;对$replace变量感到困惑。但是您似乎直接回显了它,而不是将修改后的字符串结果返回给preg_replace_。这个建议使我的代码正常工作。另外,我在repl函数中使用了array_shift好的,现在就开始;对$replace变量感到困惑。但是您似乎会立即回显它,而不是将更改后的字符串结果返回给preg_replace_。此建议消除了错误,但mario的答案更完整。此建议消除了错误,但mario的答案更完整。