2013-03-04 111 views
1

我得到这个错误,但preg_replace_callback我无法找出原因:与匿名函数

Parse error: syntax error, unexpected $end in C:\wamp\www\test.php(19) : eval()'d code on line 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 
+0

你真的应该使用'switch'语句而不是'eval'。另外,你应该在'[* + - \ /]'中跳过连字符。在'[]'里面'它表示*从'+'**到*'\\'*。你也可以把它作为括号中的最后一个字符。更重要的是,当你使用数学运算符时,第一次和最后一次捕获应该只是数字,即'\ d +'而不是'\ w +'。 – 2013-03-04 17:42:07

+0

谢谢你的正则表达式评论。我可能最终会使用'switch' - 我认为问题出在我的匿名函数上,而不是eval。 – 2013-03-04 17:44:43

+0

第一个操作数实际上只是我的'$ symbols'数组的索引,但第二个操作数将始终是一个数字。 – 2013-03-04 17:48:31

回答

3

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

实际得到的结果并分配它,你需要:

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

正如@ggutenberg说,至少是分号避开语法错误。但return做你想做的事情。

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

+0

此建议使我的代码正常工作。另外,我在'repl'函数中使用'array_shift' – 2013-03-04 17:46:12

+0

好吧,现在就开始吧;对你的'$ replace'变量感到困惑。但是你显然回显它,而不是将修改过的字符串结果返回到preg_replace_ – mario 2013-03-04 17:47:16

1

尝试在您的评估字符串的末尾添加分号。

+0

这个建议让错误消失了,但马里奥的答案更加完整。 – 2013-03-04 19:14:11