如何在php中解析查询(字符串)

时间:2012-01-11 12:50:19

标签: php parsing language-design parser-generator

我正在开发一个PHP项目,该项目处理以键值对的形式存储一组信息并使用查询检索它们。在此项目中,检索信息的查询属于以下类型。

(color: 'red' & size: 'small') | (color: 'yellow' & weight: 'heavy')

此查询表示从我的存储中选择描述颜色为红色的信息,以及尺寸为小或颜色为黄色的信息以及非常重的信息。一旦我解析了这个查询并从中提取单元,我将形成一个mysql查询并从数据库中获取所需的信息。

我想知道如何解析上面的字符串并得到单位(我不确定它是否被称为词汇单位)。如果我们有自定义解析器的库,请告诉我。

2 个答案:

答案 0 :(得分:0)

您要表达的条件可以使用非语境语法进行形式化。例如:

attributeName := string
attributeValue := ' string '
expression := ( expression & expression ) ||
              ( expression | expression ) ||
              attributeName : attributeValue

假设字符串被定义为一系列字母数字字符。

使用递归函数编写此语法的解析器非常简单。在最简单的情况下,您需要为语法中的每个生产编写一个函数来测试可能的匹配。

如果条件作为SoP“标准化”,你也可以使用正则表达式,因为它只包含& -clauses或者用| -clauses组成。

最后,我知道一个名为PHP_ParseGenerator的解析器生成器: http://pear.php.net/package/PHP_ParserGenerator/redirected

答案 1 :(得分:0)

没有可用于 PHP 的库,这些库已被主动维护和修复。您可以使用YACC和它的BNF样式语法定义来获取自定义语言的C语法分析器。 PEAR中有一个(PHP_ParserGenerator),但要注意它不再维护。

您可以查看here

解析器的BNF是:

<rule>::=<rule>"|"<rule> |
         <rule>"&"<rule> |
         "("<rule>")"    |
         <attribute>":"<value>
<attribute>::=[a-z0-9]
<value>::="'"[a-z0-9]"'"

但解析看起来很容易,一旦遇到(令牌,你就会找到相应的结束)令牌,并递归地解析该部分。