我得到这个错误,但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
你真的应该使用'switch'语句而不是'eval'。另外,你应该在'[* + - \ /]'中跳过连字符。在'[]'里面'它表示*从'+'**到*'\\'*。你也可以把它作为括号中的最后一个字符。更重要的是,当你使用数学运算符时,第一次和最后一次捕获应该只是数字,即'\ d +'而不是'\ w +'。 – 2013-03-04 17:42:07
谢谢你的正则表达式评论。我可能最终会使用'switch' - 我认为问题出在我的匿名函数上,而不是eval。 – 2013-03-04 17:44:43
第一个操作数实际上只是我的'$ symbols'数组的索引,但第二个操作数将始终是一个数字。 – 2013-03-04 17:48:31