提醒:本文最后更新于 148 天前,其中某些信息可能已经过时,请谨慎使用!
你似乎正在查看一篇很久远的文章。
为了你这样的访客,我特地保留了我的历史博文。不要笑话过去的我,用温柔的目光看下去吧。
     这是一篇技术文章,适合喜欢写代码,写规则,喜欢掌握一切的同学。。它是爱阅书源的精华,如果你弄懂了,再写一个爱阅完全没问题,加油,少年



图片
图片

概要

一切都是为了得到我们想要的数据!

爱阅规则可以由一条或多条规则组合在一起。
一条规则
一条规则
组合规则
组合规则
多条规则
多条规则
最简单就是一条规则,取到所需数据;
多条规则,就是将第一条规则得到的结果,传递给第二条规则进一步处理。

规则处理流程

  1. 先按@put顺序处理, 去掉@put之后的规则为A
  2. 对A进行组合判断,生成非组合规则,每个非组合规则按以下顺序处理
  3. 取@get,去掉@get之后的规则为B。将@get生成的值,替换B规则内容后生成规则C
  4. 将使用规则C中带有#的正则提取出来,得到规则D
  5. 从头处理规则D
  6. 处理正则

基本例子说明

假设原始内容为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
 再执行得到最终结果

具体规则

以下是最基本的规则说明,爱阅的数据解析就是由下面的规则来组合处理的。虽然规则都提供了缩写,但是,正常情况下,请不要使用,否则过几天,你可能就忘了是什么意思,切记切记!

定义字符串

@def:』缩写为『!.』。用于定义字符串。
例子:

@def:这是自定义内容
!.这是自定义内容

执行结果:

这是自定义内容

JSON解析

@json:』缩写为『$.』用于解析JSON数据
例子:

假设有JSON:
{
  "key1": "value1",
  "sub":{"key2": "value2"}
 }

执行规则:

@json:key1 结果为value1
@json:sub.key2 结果为value2

HTML解析方法一

@xpath:』缩写为『/.』较全面的解析HTML规则,可在网上搜索xpath来得到详细的文档,这里不展开说。

HTML解析方法二

@ex:』缩写为『%.』,爱阅对xpath规则进行封装后,提供更方便的写法
例子:

假设有HTML内容 
 <a href=xxx>ABC</a>

执行规则:

@ex:a.@href 结果为xxx
@ex:a.@text 结果为ABC

字符串处理

@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

正则表达式

@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>的所有内容

动态格式化处理

使用『%@』,在搜索中,它表示用户输入的内容
使用『%@calc(pageIndex)』表示pageIndex从0开始
支持: !(对数取反), /(除), *, %, +, -, <<, >>, >, >=, <, <=, ==, !=

如:
%@calc(pageIndex + 1)
%@calc(pageIndex * 10

例子:
a=%@&b=123&page=%@calc(pageIndex + 1)
假设用户输入:YY,当前是第一页
结果为:a=YY&b=123&page=1

组合规则

@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的函数
  1. 当首个规则不是@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
  1. 当内嵌出现@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. #的下一字符同样的#时,表示要强制将所有内容合并为字符串
1. 正则可为空时将结果转为字符串
1. 若为数组,若是强制合并字符串(带##),则是合并字符串后再执行正则,返回字符串,
否则将数组内的每个元素转为字符串,执行正则,生成的结果后再返回数组或字符串

请求数值处理

网站要求用GBK编码时,可以使用 JxdSecuritySub.Gb2312Encoded:value 来格式化。
要求使用Base64时,可使用 JxdSecuritySub.Base64EncodeByString:value 来格式化。

结束语

如果有幸看到这里,证明你还是一个非常有耐心的同学了,如果想用好爱阅的规则,那得多练习,只看不写,是没有用的!

为了表示对制作书源同学的敬意,如果你能自己制作书源,并且愿意分享,那么请与我联系(爱阅书香-关于),将获得神秘礼物,并且还能拿到更加高级,更加灵活的规则哦。


本当の声を響かせてよ