1

我正在尝试在 PHP 中创建一个函数来评估数学表达式——包括诸如 sin、cos 等函数。我的方法是删除短语中不是数字、数学运算符或数学函数的所有字符,并且然后在 eval() 中使用该字符串。问题是我对正则表达式的了解不够,无法否定同一表达式中的字符和短语。

到目前为止,这就是我所拥有的:

$input = preg_replace("/[^0-9+\-.*\/()sincota]/", "", $input);

显然,sin、cos 和 tan 的字符可以在输入表达式中以任何顺序使用(而不是允许使用短语 sin、cos 和 tan)。如果我进一步扩展此功能以包含更多字符和功能,则会带来更大的安全风险,因为恶意用户将能够通过与应用程序的巧妙交互来执行几乎任何 PHP 命令。

谁能告诉我如何修复我的正则表达式并消除这个问题?

4

2 回答 2

1

我正在尝试在 PHP 中创建一个函数来评估数学表达式——包括诸如 sin、cos 等函数

我是否可以建议利用已经投入PHPExcel的多年工作,其中已经包含一个公式解析器。

它包括cossin其他数百个。

否则,您可以寻找正匹配,而不是否定:

$matches = array();
preg_match_all("#([0-9,/\*()+\s\.-]|sin|cos)+#", 'sin(12) + cos(13.5/2) evddal * (4-1)', $matches);
echo implode('', $matches[0]);

/* output:
sin(12) + cos(13.5/2) * (4-1) 
*/
于 2010-10-07T17:16:16.147 回答
0

你可以试试这个:

preg_replace("/(sin|cos|tan)?[^0-9+\\.*\/()-]/", "$1", $input);

ideone.com 上的代码

但是如果你试图解析一个表达式来评估它,我建议你解析它而不是简单地通过正则表达式模式传递它。

于 2010-10-07T17:02:01.813 回答