书源规则说明(6.8.0版本后有效)
这是一篇技术文章,适合喜欢写代码,写规则,喜欢掌握一切的同学。它是爱阅书源的精华,如果你弄懂了,再写一个爱阅完全没问题,加油,少年。
一:概要
一切都是为了得到我们想要的数据!
爱阅规则可以由一条或多条规则组合在一起。
一条规则
组合规则
多条规则
最简单就是一条规则,取到所需数据;
多条规则,就是将第一条规则得到的结果,传递给第二条规则进一步处理。
规则处理流程:
先按@put顺序处理, 去掉@put之后的规则为A
对A进行组合判断,生成非组合规则,每个非组合规则按以下顺序处理
取@get,去掉@get之后的规则为B。将@get生成的值,替换B规则内容后生成规则C
将使用规则C中带有#的正则提取出来,得到规则D
从头处理规则D
处理正则
基本例子说明
假设原始内容为ABC
x{{y}}{{z}}。则x, y, x都是对ABC进行处理,得到结果KO
若有下一条规则p{{y}}, 这时,p, y就是对KO进行处理了
若使用@comb命令@comb:p{{y}}, 则p是对ABC进行处理,得到结果HI,此时若两个结果都存在,则会合并为数组[KO,HI]。
若@comb不是用在最开始,如p{{@comb:y}}, 则此时p是对KO进行处理,但y是对ABC进行处理
假设原内容为JSON格式,如下:
{
'name': 'iFreeTime',
'title': '爱阅书香',
'bookID': 100
}
执行命令:
@json:name
得到结果:iFreeTime
解释:取得JSON中,字段name对应的值
@json:noExists || @json:title
得到结果:爱阅书香
解释:取得JSON中noExists字段的值,如果没有,则取title字段的值
@json:name && @json:title
得到结果,一个数组:[iFreeTime,爱阅书香]
解释:取得JSON中name字段与title字段的值,
如果两个值都存在,则并将其合并为一个数组,
如果只有一个值,则直接返回值
@json:title{{@json:name}}##
得到结果:爱阅书香iFreeTime
解释:先取name的值,再取title的值
按规则顺序生成一个数组[爱阅书香, iFreeTime]
执行##
将结果格式化为一个字符串:爱阅书香iFreeTime
@json:tit@get:{@def:le}
得到结果:爱阅书香
解释:先执行@get:{@def:le},得到le,与原来的@json:tit组成@json:title
再执行得到最终结果
@json:tit@get:{key1}@put:{key1:@def:le}
得到结果:爱阅书香
解释:
最先执行:@put:{key1:@def:le},生成key1的内容为le
先执行@get:{key1},得到le,与原来的@json:tit组成@json:title
再执行得到最终结果
二:具体规则
(逼疯爱阅的十大酷刑之一:问我在不在,然后就没下文了。)
1.定义字符串
『@def:』缩写为『!.』。用于定义字符串。
例子:
@def:这是自定义内容
!.这是自定义内容
执行结果:
这是自定义内容
2.JSON解析
『@json:』缩写为『$.』用于解析JSON数据
例子:
假设有JSON:
{
'key1': 'value1',
'sub':{'key2': 'value2'}
}
执行规则:
@json:key1 结果为value1
@json:sub.key2 结果为value2
3.HTML解析方法一
『@xpath:』缩写为『/.』较全面的解析HTML规则,可在网上搜索xpath来得到详细的文档,这里不展开说。
4.HTML解析方法二
『@ex:』缩写为『%.』,爱阅对xpath规则进行封装后,提供更方便的写法
例子:
假设有HTML内容
<a href=xxx>ABC</a>
执行规则:
@ex:a.@href 结果为xxx
@ex:a.@text 结果为ABC
5.字符串处理
『@str:』缩写为『&.』,提供定制的函数,对字符串进行处理。提供了以下功能函数。
不改变原内容
self 返回本身
pos(param) 查找指定字符串的位置,
param表示要查找的字符, 不改变原内容
rpos(param) 反向查找指定字符串的位置,
param表示要查找的字符, 不改变原内容
mark(param) 标志两个位置之间的字符串,
param参数为可选:
1包括前标志,2包括后标志,3包括前后标志,其它表示不包括前后标志,
不改变原内容
后续可使用@mark[0],@mark[1]之类的标志获取到的值
split(param) 使用指定的子串将当前内容分隔为多个,
不改变原内容,新的将替换旧的分割分组
后续可使用@split[0], @split[1]或来获取值
将改变原内容, 当内容被修改后,则之前有关位置的信息都将自动删除
将两边的值连接在一起,可以用: 'ab' ccc,
使用 '' 时,其内字符串都为效,不使用时,前后空格将自动去除
开头若为'abc.xyz'开始,由内容就是abc.xyz
若是没有使用''来包含abc.xyz,则内容就变成abcxyz
left(param) 获取最后位置的左边字符串
param参数为可选:1包括标志,其它表示不包括标志
right(param) 获取最后位置的右边字符串
param参数为可选:1包括标志,其它表示不包括标志
trim 对字符串的前后空格进行删除
mid(param) 获取两个位置之间的内容,
param参数为可选:1包括前标志,2包括后标志,3包括前后标志,其它表示不包括前后标志
del(param) 删除两个位置之间的字符串
param参数为可选:1包括前标志,2包括后标志,3包括前后标志,其它表示不包括前后标志
sub(p0, p1) 获取给定两个位置之间的内容,
参数不提供表示0,p0 == p1时,取一个字符;p1 < p0 时,表示取到最后
replace(oldParam, newParam) 使用新字符串替换旧字符串
若要过滤 )与, 符号的话,必须加转义符 \)与\,
支持使用@mark[0]或@split[0]之类的来取值
@content[0] 取数组元素
@content[key] 取字典值
例子:
假设有字符串:ABC123abc
执行规则:
@str:pos(123).left 结果:ABC
解释:查找123的位置,取它的左边
@str:pos(C).pos(a).mid 结果:123
查找C的位置,再查找a的位置,取它们中间的内容
@str:pos(C).pos(a).mark(3).replace(@mark[0],新内容)
解释:查找C的位置,再查找a的位置,将中间的内容进行与前后符号进行标记,
再使用replace进行替换,其中@mark[0]表示我们之前标记的内容
结果: AB新内容bc
6.正则表达式
『@regex:』缩写为『#.』,对字符串进行处理,正则可以在网上搜索,看详细文档。同时,爱阅也对正则进行了一些特别的处理,如下说明
完整格式:reg1 @[1,3] reg2 @ ... regn @[x...yz]=>newString &&或|| 其它表达式
||表示只要前面的正式能配置到内容,则不再执行后面的正式。
&&表示将前面正则的配置结果作为下一个正则的输入条件,再次去执行正则;
reg表示的是常规的正则表达式。
有多个reg时,' @' 是不可省的,@之后可以接 [] 或 => 或 或 =& 空格
[] 范围指定,
0为开始,正数表示从头取,负数表示从后取,
!表示排除, -表示倒序, 以 , 为分隔
如:[0,3,4]
=> 或 =& 标志必须在最后才能出现
=> 表示所有匹配到的数据,都将替换成新字符串;此时将忽略范围。
当有多个@时,第一个@之前的规则生成新的内容,将用于第二个@的规则
=& 表示将所有匹配到的数据合并成新的内容,以=&后续的字符串为分割
当错误时,返回空
如:<p>.*?</p> @=>XYZ <p>..</p>的信息替换为XYZ
<p>.*</p> @[1] <ul>.*</ul> 获取第二个<p>..</p>与<ul>...</ul>的所有内容
7.动态格式化处理
使用『%@』,在搜索中,它表示用户输入的内容
使用『%@calc(pageIndex)』表示pageIndex从0开始
支持: !(对数取反), /(除), *, %, , -, <<, >>, >, >=, <, <=, ==, !=
如:
%@calc(pageIndex 1)
%@calc(pageIndex * 10
例子:
a=%@&b=123&page=%@calc(pageIndex 1)
假设用户输入:YY,当前是第一页
结果为:a=YY&b=123&page=1
8.组合规则
『@comb:』缩写为『?.』。
此规则后接规则,若没有前缀,则表示是@def类型。
如果用于多语句中,则将与上与最近一个结果组成数组, 空值不会被合并!,
其后接规则,将是对原始内容进行处理
例子说明:
假设原始内容为ABC
规则:[@def:abc, @comb:dd]
结果为:[abc,dd]
解释:第一个规则生成结果 abc, 第二条规则生成结果dd
合并成数组[abc,dd]
三:get与put规则说明
支持自定义函数 @get:{key} 与@put:{key:rule},若内部存在}符号,必须在}之前加入'\'.
put函数将最先被执行处理,生成一个key-value的内容,后续可以使用get来取对应的内容。其中key就是单纯的字符串,不支持使用规则来生成。rule支持组合规则。
get的key支持:
1:使用单纯的字符串,此时是取put生成的内容;
2:使用带前缀的规则,此时Key的内容将由规则生成,不会取put设置的值。
key与rule生成的内容,将自动转成字符串
例子:
假设@json:name的值为ABC
@put:{key1:@json:name} 结果 key1被设置为ABC
@get:{key1} 结果为ABC
abc@get:{key1} 结果为 abcABC
@ex:div.@get:{key1} 结果为 @ex:div.ABC
四:内嵌规则{{rule}}说明
1.当前缀不存在时,默认使用@str。
2.当首个规则为@str时,将内嵌规则生成的内容与原来规则内容合成在一起后,再使用@str来处理
例子
假设原始内容为:ABC123abc
xx.{{@def:pos}}(123).left
@str:xx.{{@def:pos}}(123).left
是一样的
结果为 xxABC
解释:执行内嵌规则得到新规则:xx.pos(123).left, 再使用@str规则来执行
如果是内容带有.符号时,可以加个”“来处理,如
'http://a.b.c.' {{@def:pos}}(123).left
结果为:http://a.b.c.ABC
带''时,此内容被认为一个整体,
不带''时,刚内容以.为分隔进行处理,这样可以支持@str的函数
3.当首个规则不是@str时,将从头到尾执行内嵌与非内嵌规则,将它们生成的内容,组合为一个字符串或数组
例子:
假设有原始内容:
{
'name': 'iFreeTime',
'title': '爱阅书香',
'bookId': 80
}
注意,此时bookId是整形
@json:name{{@json:title}}bookId
@json:name{{@json:title}}{{@json:bookId}}
效果一样,此时首个规则不是@str。
结果为:['iFreeTime', '爱阅书香', 80]
解释:分别获取各个规则的内容,再将它们结合成数组
若后续加上#
@json:name{{@json:title}}bookId#
则生成结果都为字符串['iFreeTime', '爱阅书香', '80']
若后续加上##
@json:name{{@json:title}}bookId##
则结果为:iFreeTime爱阅书香80
4.当内嵌出现@comb时,则只是为了取原始内容来进行分析
例子:
[@json:name, @str:self {{@comb:@json:name}}
执行结果:NameName
第一条规则:@json:name 生成 Name
第二条规则:@str:self {{@comb:@json:name}},
内嵌要用@comb才能取到原始内容。
不使用@comb时,则是针对第一条规则的结果进行处理
(第一条规则也是有可能返回JSON数据的)
五:组合规则说明
|| 第一个成功取得内容后,停止后续规则的执行
&& 所有规则都将被执行,合并所有内容为数组
组合规则停止判断条件:@def:, @regex:
@comb:后的规则为@def:或@regex:
当执行到某一条规则的前开始是为@comb时,将上一结果与此次结果组合成数组
六:正则表达式
最后一条规则可接'#'字符表示单一的正则表达式:
1.#的下一字符同样的#时,表示要强制将所有内容合并为字符串
2.正则可为空时将结果转为字符串
3.若为数组,若是强制合并字符串(带##),则是合并字符串后再执行正则,返回字符串,
否则将数组内的每个元素转为字符串,执行正则,生成的结果后再返回数组或字符串
七:结束语