这是一篇技术文章,适合喜欢写代码,写规则,喜欢掌握一切的同学。它是爱阅书源的精华,如果你弄懂了,再写一个爱阅完全没问题,加油,少年。 一:概要 一切都是为了得到我们想要的数据! 爱阅规则可以由一条或多条规则组合在一起。 一条规则 组合规则 多条规则 最简单就是一条规则,取到所需数据; 多条规则,就是将第一条规则得到的结果,传递给第二条规则进一步处理。 规则处理流程:
基本例子说明 假设原始内容为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:noExists || @json:title 得到结果:爱阅书香 解释:取得JSON中noExists字段的值,如果没有,则取title字段的值
@json:title{{@json:name}}## 得到结果:爱阅书香iFreeTime 解释:先取name的值,再取title的值 按规则顺序生成一个数组[爱阅书香, iFreeTime] 执行## 将结果格式化为一个字符串:爱阅书香iFreeTime
@json:tit@get:{key1}@put:{key1:@def:le} 得到结果:爱阅书香 解释: 最先执行:@put:{key1:@def:le},生成key1的内容为le 先执行@get:{key1},得到le,与原来的@json:tit组成@json:title 再执行得到最终结果 二:具体规则 (逼疯爱阅的十大酷刑之一:问我在不在,然后就没下文了。) 1.定义字符串 『@def:』缩写为『!.』。用于定义字符串。 例子:
执行结果: 这是自定义内容 2.JSON解析 『@json:』缩写为『$.』用于解析JSON数据 例子:
执行规则: @json:key1 结果为value1 @json:sub.key2 结果为value2 3.HTML解析方法一 『@xpath:』缩写为『/.』较全面的解析HTML规则,可在网上搜索xpath来得到详细的文档,这里不展开说。 4.HTML解析方法二 『@ex:』缩写为『%.』,爱阅对xpath规则进行封装后,提供更方便的写法 例子:
执行规则: @ex:a.@href 结果为xxx @ex:a.@text 结果为ABC 5.字符串处理 『@str:』缩写为『&.』,提供定制的函数,对字符串进行处理。提供了以下功能函数。
例子: 假设有字符串:ABC123abc 执行规则:
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开始 支持: !(对数取反), /(除), *, %, , -, <<, >>, >, >=, <, <=, ==, !=
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生成的内容,将自动转成字符串 例子:
四:内嵌规则{{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时,将从头到尾执行内嵌与非内嵌规则,将它们生成的内容,组合为一个字符串或数组 例子:
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.若为数组,若是强制合并字符串(带##),则是合并字符串后再执行正则,返回字符串, 否则将数组内的每个元素转为字符串,执行正则,生成的结果后再返回数组或字符串 七:结束语 |
|