排除不在列表中的所有字符而不在短语列表中

时间:2010-10-07 16:57:57

标签: php regex regex-negation

我正在尝试在PHP中创建一个能够评估数学表达式的函数 - 包括sin,cos等函数。我的方法是删除短语中不是数字,数学运算符或者数学函数然后在eval()中使用该字符串。问题在于我对正则表达式的了解不足以否定同一表达式中的字符和短语。

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

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

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

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

2 个答案:

答案 0 :(得分:1)

  

我正在尝试制作一个功能   将评估数学的PHP   表达 - 包括这样的功能   作为罪,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) 
*/

答案 1 :(得分:0)

你可以试试这个:

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

code on ideone.com

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