(PHP)评估简单的逻辑表达式

时间:2012-07-07 23:10:33

标签: php

我的表达式如下(EBNF):

<expression> ::= ["("]<base>[")"][{<modifier>"("<expression>")"}]
<base>       ::= <logical>[{<modifier><logical>}]
<logical>    ::= "1" | "0"
<modifier>   ::= "&" | "|"

此格式的字符串示例如下:

(1|(1&0))|(1&(1|0))

或者我可以用后缀表示法得到它:

110&|110|&|

在PHP中,有一种简单的方法来评估这个吗? (即此特定示例的结果应为1)。由于安全问题,我想避免使用eval函数。

如果在没有eval函数的PHP中没有简单的方法来实现这一点,那么编写自定义解析器的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

如果没有eval函数,这在PHP中并不容易实现。

您将不得不使用preg_match或类似的东西来评估您的代码,然后将其转换。

答案 1 :(得分:1)

最简单的方法是使用eval。 要解决安全问题,您可以设置白名单: $ whitelist = array('(',')','1','0','%','|');

编写解析器的最佳方法是获取解析器生成器 “loco”或“lime”或“php-peg”。您只需定义语法并开始解析它 使用RegexpParser或StringParser(或两者)。 http://qntm.org/loco - http://qntm.org/files/loco/Loco.php

答案 2 :(得分:1)

我知道已经有了正确的答案,但有一个EBNF的PHP解析器here