分享

书源规则说明(6.8.0版本后有效)

 pendoM 2021-07-25

这是一篇技术文章,适合喜欢写代码,写规则,喜欢掌握一切的同学。它是爱阅书源的精华,如果你弄懂了,再写一个爱阅完全没问题,加油,少年。

一:概要

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

爱阅规则可以由一多条规则组合在一起。

一条规则

Image

组合规则

Image

多条规则

Image

最简单就是一条规则,取到所需数据;

多条规则,就是将第一条规则得到的结果,传递给第二条规则进一步处理。

 规则处理流程:

  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 再执行得到最终结果

 二:具体规则

以下是最基本的规则说明,爱阅的数据解析就是由下面的规则来组合处理的。虽然规则都提供了缩写,但是,正常情况下,请不要使用,否则过几天,你可能就忘了是什么意思,切记切记!
另一个,如果你是新手,看完后,请自行在爱阅书香进行练习,这东西靠看是学不会,一定要动手实操,才能学得会,这里有些新手教程。
书源制作入门级例子
书源制作进阶例子
书源文档之内容解析
 如果你没有实操过,请不要问我规则是什么意思!如果你会一点点的分析HTML或数据,并且自己创建了书源,那些,有问题找我时,请直接说明那里有问题,并把书源发送给我,我会尽快回复你的。

逼疯爱阅的十大酷刑之一问我在不在,然后就没下文了。

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,则内容就变成abcxyzleft(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(oldParamnewParam) 使用新字符串替换旧字符串  若要过滤 )与, 符号的话,必须加转义符 \)与\,  支持使用@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} 结果为ABCabc@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.若为数组,若是强制合并字符串(带##),则是合并字符串后再执行正则,返回字符串,

        否则将数组内的每个元素转为字符串,执行正则,生成的结果后再返回数组或字符串

七:结束语

如果有幸看到这里,证明你还是一个非常有耐心的同学了,如果想用好爱阅的规则,那得多练习,只看不写,是没有用的!
为了表示对制作书源同学的敬意,如果你能自己制作书源,并且愿意分享,那么请与我联系(爱阅书香-关于),将获得神秘礼物,并且还能拿到更加高级,更加灵活的规则哦。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多