引力子 / rql-parser
v3.1.0
2023-03-13 13:22 UTC
Requires
- php: >=8.1.0
Requires (Dev)
- phpunit/phpunit: ~8
- squizlabs/php_codesniffer: ~2.0
README
这是一个用PHP编写的RQL解析库。
该库包含以下部分
- RQL代码的词法分析器
- 创建抽象语法树的解析器
安装
安装库的首选方式是通过 composer。
运行以下命令
composer require graviton/rql-parser
或者在您的 composer.json
文件的require部分添加
"graviton/rql-parser": "*",
基本用法
<?php require 'vendor/autoload.php'; // default lexer supports all RQL rules $lexer = new Graviton\RqlParser\Lexer(); // default parser contains all parsing strategies $parser = new Graviton\RqlParser\Parser(); // RQL code $rql = '(eq(a,string:1)|lt(b,2)|(c<>3&d>=string:4&e=eq=boolean:1))&u!=5¬(or(u=6,ge(i,10)))&z=1&(a==2|b<-3|in(c,(2,float:3)))&select(a,b)&sort(+a,-b)&limit(1,2)'; // tokenize RQL $tokens = $lexer->tokenize($rql); // parsing var_dump($parser->parse($tokens));
也请参阅 rql-command库。这是一个用于调试RQL词法和解析的控制台应用程序。
高级用法
请参阅示例
当前状态
运算符
基本语法
- 标量运算符
eq(a,b)
ne(a,b)
lt(a,b)
gt(a,b)
le(a,b)
ge(a,b)
- 数组运算符
in(a,(b,c))
out(a,(b,c))
- 逻辑运算符
and(eq(a,b),ne(c,d))
or(eq(a,b),ne(c,d))
not(eq(a,b))
简化的逻辑语法
(eq(a,b)&ne(b,c))
(eq(a,b)|ne(b,c))
FIQL语法
- 标量运算符
a=eq=b
a=ne=b
a=lt=b
a=gt=b
a=le=b
a=ge=b
- 数组运算符
a=in=(b,c)
a=out=(b,c)
简化的FIQL语法
a=b
a==b
a<>b
a!=b
a<b
a>b
a<=b
a>=b
其他
select(a,b,c)
sort(+a,-b)
limit(1,2)
所有语法变体可以一起使用。
值类型
- 字符串
abc
abc%20def
- 整数
1
,+1
,-1
- 浮点数
1.
,+1.
,-1.
0.1
,+0.1
,-0.1
,0.1e5
,+0.1e+5
,-0.1e-5
.1
,+.1
,-.1
.1e5
,+.1e+5
,-.1e-5
- 布尔值
true()
false()
- null
null()
- empty
empty()
- 日期
2015-06-02T20:00:00Z
- glob
abc*
?abc
abc*def?
类型转换
string:1
boolean:0
integer:a
float:1
编码规则
字符串值
在字符串值中,所有非字母数字字符都必须使用百分号(%)后跟两个十六进制数字进行编码。
示例
eq(string,2015%2D05%2D30T15%3A10%3A00Z)
in(string,(%2B1%2E5,%2D1%2E5))
in(string,(null%28%29,empty%28%29,true%28%29,false%28%29))
PHP中的字符串编码
function encodeString($value) { return strtr(rawurlencode($value), [ '-' => '%2D', '_' => '%5F', '.' => '%2E', '~' => '%7E', ]); }
JavaScript中的字符串编码
function encodeString(value) { return encodeURIComponent(value).replace(/[\-_\.~!\\'\*\(\)]/g, function (char) { return '%' + char.charCodeAt(0).toString(16).toUpperCase(); }); }
其他值
日期、数字和常函数值不得编码。
示例
eq(date,2015-05-30T15:10:00Z)
in(number,(+1.5,-1.5))
in(const,(null(),empty(),true(),false()))