我的表达式如下(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中没有简单的方法来实现这一点,那么编写自定义解析器的最佳方法是什么?
答案 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