使用VBS正则表达式匹配网页搜索网页链接并点击

用户名:pangfc
文章数:286
评论数:86
访问量:167257
注册日期:
阅读量:1297
阅读量:3317
阅读量:441098
阅读量:1127412
51CTO推荐博文
先放出测试代码,然后再对几个关键点进行简单解释package&
import&java.util.regex.M
import&java.util.regex.P
public&class&Test1&{
public&static&void&main(String[]&args)&{
String&str1&=&"&a&href=\"/2015/10/hello-world/\"&title=\"\"&data-original-title=\"Hello&World\"&Hello&World&/a&";
String&str2&=&"&a&href=\"/363.html\"&class=\"post-feature\"&\"&123&/a&";
String&str3&=&"&&a&class=\"article-title\"&href=\"//Webstorm-Hotkeys-For-Mac/\"&c&/a&";
String&str4&=&"&&a&rel=\"bookmark\"&title=\"Permanent&Link&to&&黑客组织‘SkidNP’涂改了Phantom&Squad的网站首页\"&href='12/hack-30127.htm'&黑&/a&";
String&str5&=&"&a&href=\"//1-3/\"&title=\"\"&data-original-title=\"2015圣诞节雪花代码[天猫+C店]\"&&2015圣诞节雪花代码[天猫+C店]&&span&class=\"label&label-new&entry-tag\"&New&/span&&&/a&";
Pattern&pattern&=&pile("&a.*?href=[\"']?((https?://)?/?[^\"']+)[\"']?.*?&(.+)&/a&");&&
Matcher&matcher&=&pattern.matcher(str1);
if(matcher.find()){
String&link&=&matcher.group(1).trim();
String&title&=&matcher.group(3).trim();
if(!link.startsWith("http")){
if(link.startsWith("/"))
link&=&""&+&
link&=&""&+&
System.out.println("link:&"&+&link);
System.out.println("title:&"&+&title);
}解释:1 选取了几个有代表性的a标签样式进行测试2 关于正则匹配模式”&a.*?href=[\”‘]?((https?://)?/?[^\”‘]+)[\”‘]?.*?&(.+)&/a&“的说明:i)&a.*?href= & &&a开头,中间紧跟着有0个或者多个字符,然后再跟着href=&ii)[\”‘]?((https?://)?/? 一个或者0个的” 或者 ‘ ,然后再跟着0个或者一个的http://或者https:// ,再跟着0个或者1个的 /iii)[^\”‘]+ &表示1个以上的不包括’或者” 的任意字符iv)[\”‘]?表示链接后面的’或者” 当然也可能没有后面的可以根据前面的自己推理,就不解释了3 matcher.group(1)表示取出链接,也就是第二个()的内容(PS:第一个()表示的是整个正则表达式,默认省略了),在正则中是这一段规则:((https?://)?/?[^\”‘]+)4&matcher.group(3) 同理可知,对应的是这一段规则:(.+)5 对于代码中的 ,这是由于部分链接使用了相对路径,比如说:href=’12/hack-30127.htm’ 。这时我们就需要加上它的域名,当然需要根据实际情况来加。这里我就随便乱加了650) this.width=650;" src="/wp-content/plugins/kindeditor-for-wordpress/plugins/emoticons/images/13.gif" border="0" alt="" style="border:0vertical-align:height:" />本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)VBS教程:正则表达式简介 -后向引用
VBS教程:正则表达式简介 -后向引用
  后向引用  正则表达式一个最重要的特性就是将匹配成功的模式的某部分进行存储供以后使用这一能力。请回想一下,对一个正则表达式模式或部分模式两边添加圆括号将导致这部分表达式存储到一个临时缓冲区中。可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对这部分正则表达式的保存。  所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。   后向引用一个最简单,最有用的应用是提供了确定文字中连续出现两个相同单词的位置的能力。请看下面的句子:  Is is the cost of of gasoline going up up?  根据所写内容,上面的句子明显存在单词多次重复的问题。如果能有一种方法无需查找每个单词的重复现象就能修改该句子就好了。下面的 Visual Basic Scripting Edition 正则表达式使用一个子表达式就可以实现这一功能。   /\b([a-z]+) \1\b/gi  等价的 VBScript 表达式为:  "\b([a-z]+) \1\b"  在这个示例中,子表达式就是圆括号之间的每一项。所捕获的表达式包括一个或多个字母字符,即由'[a-z]+' 所指定的。该正则表达式的第二部分是对前面所捕获的子匹配的引用,也就是由附加表达式所匹配的第二次出现的单词。'\1'用来指定第一个子匹配。单词边界元字符确保只检测单独的单词。如果不这样,则诸如 "is issued" 或 "this is" 这样的短语都会被该表达式不正确地识别。   在 Visual Basic Scripting Edition 表达式中,正则表达式后面的全局标志 ('g') 表示该表达式将用来在输入字符串中查找尽可能多的匹配。大小写敏感性由表达式结束处的大小写敏感性标记 ('i') 指定。多行标记指定可能出现在换行符的两端的潜在匹配。对 VBScript 而言,在表达式中不能设置各种标记,但必须使用 RegExp 对象的属性来显式设置。  使用上面所示的正则表达式,下面的 Visual Basic Scripting Edition 代码可以使用子匹配信息,在一个文字字符串中将连续出现两次的相同单词替换为一个相同的单词:  var ss = "Is is the cost of of gasoline going up up?.\n";var re = /\b([a-z]+) \1\b/
//创建正则表达式样式.var rv = ss.replace(re,"$1");
//用一个单词替代两个单词.  最接近的等价& VBScript 代码如下:  Dim ss, re, rvss = "Is is the cost of of gasoline going up up?." & vbNewLineSet re = New RegExpre.Pattern = "\b([a-z]+) \1\b"re.Global = Truere.IgnoreCase = Truere.MultiLine = Truerv = re.Replace(ss,"$1")  请注意在 VBScript 代码中,全局、大小写敏感性以及多行标记都是使用 RegExp 对象的适当属性来设置的。  在replace 方法中使用 $1 来引用所保存的第一个子匹配。如果有多个子匹配,则可以用 $2, $3 等继续引用。  后向引用的另一个用途是将一个通用资源指示符 (URI) 分解为组件部分。假定希望将下述的URI 分解为协议 (ftp, http, etc),域名地址以及页面/路径:  下面的正则表达式可以提供这个功能。对 Visual Basic Scripting Edition,为:  /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/  对 VBScript 为:  "(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)"  第一个附加子表达式是用来捕获该 web 地址的协议部分。该子表达式匹配位于一个冒号和两个正斜杠之前的任何单词。第二个附加子表达式捕获该地址的域名地址。该子表达式匹配不包括 '^'、 '/' 或 ':' 字符的任何字符序列。第三个附加子表达式捕获网站端口号码,如果指定了该端口号。该子表达式匹配后跟一个冒号的零或多个数字。最后,第四个附加子表达式捕获由该 web 地址指定的路径以及\或者页面信息。该子表达式匹配一个和多个除'#' 或空格之外的字符。  将该正则表达式应用于上面所示的 URI 后,子匹配包含下述内容:  RegExp.$1 包含 "http"  RegExp.$2 包含 ""  RegExp.$3 包含 ":80"  RegExp.$4 包含 "/scripting/"
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
职称考试题目
招生信息考研政治
网络安全安全设置工具使用手机安全
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&VBS正则表达式 命令库源码 + 正则表达式测试器 _ 综合讨论 - 按键精灵论坛
腾讯微博:
软件版本:2014.05软件大小:76.8M更新时间:2-21
软件版本:3.2.5软件大小:62.5M更新时间:06-06
软件版本:1.2.7软件大小:29.2M更新时间:06-19
软件版本:1.1.0软件大小:12.3M更新时间:12-29
查看: 9151|回复: 364
学有所成学有所成勋章,新手步入按键学堂的第一枚勋章小红帽对论坛提出良好建议(可向管理员申请)论坛GG按键论坛男性用户勋章骨灰级按键用户3年以上的按键论坛用户黄金之翼黄金之翼勋章黄瓜勋章(永久)体验商业小精灵活动的奖励按键精灵开发者6级(新浪V认证)通过新浪微博加V后自动发放,并替换普通的认证6级勋章。 按键会员(月)按键会员绑定账号后自动赠送
本帖最后由 q 于
13:31 编辑 自用命令库,拿出来分享一下如有问题,请联系 QQ 暗号: 正则接单群 6820131 喜欢插件的可以到这个帖子下载插件(VB编写)扩展学习[教程] 正则表达式的普及[精华帖]showtopic.aspx?topicid=285465&forumpage=1&page=1【心得】利用正则表达式取汉字、数字、字母的方法(欢迎补充)[精华帖]showtopic.aspx?topicid=435754&forumpage=1&page=1正则表达式教程|彻底理解、认识、运用[正则表达式] [精华帖]/thread--1.html
========================================================(30.04 K) 18:05:07========================================================正则表达式命令库+正则表达式测试器 下载 (回复可见):(, 下载次数:309)(, 下载次数:691)正则命令库源码(回复可见):[backcolor=rgb(247, 247, 247)]函数: 创建函数说明: 根据指定的正则表达式文本创建一个正则表达式对象。本对象中的原有内容将被释放。参数说明:正则表达式[文本型]: 正则表达式文本, 如 "a-z"被搜索文本[文本型]: 被搜索的源文本是否忽略大小写[逻辑型]: 是否区分大小写,如果区分大小写则设置为False,否则为True。是否匹配多行[逻辑型]: 如果设置为True,字符“^”不仅匹配目标文本的开头,而且匹配目标文本中换行符(vbCr,vbLf 或 vbCrLf)的后面。字符“$”不仅匹配目标文本的结尾,而且匹配目标文本中换行符的前面。否则字符“^”仅仅匹配目标文本的开头,“$”也仅仅匹配目标文本的结尾。是否全局匹配[逻辑型]: 该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。返回值[逻辑型]: 匹配数量大于0返回True,否则返回假返回值[逻辑型]: 匹配数量大于0返回True,否则返回假Function 创建(正则表达式, 被搜索文本, 是否忽略大小写, 是否匹配多行, 是否全局匹配)
Dim 全局匹配
集_被搜索文本 = 被搜索文本
Set regEx = New RegExp
regEx.IgnoreCase = 是否忽略大小写
regEx.Multiline = 是否匹配多行
If 是否全局匹配 = True Then
全局匹配="regEx.Global = True"
全局匹配="regEx.Global = False"
Execute 全局匹配
regEx.Pattern = 正则表达式
Set Matches = regEx.Execute(被搜索文本)
创建 = Matches.Count > 0
End Function
复制代码[backcolor=rgb(247, 247, 247)]函数:
释放函数说明: 释放正则对象返回值: 无Sub 释放()
Set regEx = Nothing
Set Matches = Nothing
复制代码[backcolor=rgb(247, 247, 247)]函数:
替换函数说明: 替换在正则表达式查找中找到的文本参数说明: 用作替换的文本[文本型]: 用于替换正则匹配到的文本返回值: 返回替换结果,失败返回空文本Function 替换(用作替换的文本)
If IsObject(regEx) = True Then
替换 = regEx.Replace(集_被搜索文本, 用作替换的文本)
End Function
复制代码[backcolor=rgb(247, 247, 247)]函数:
取匹配数量函数说明: 取出正则表达式匹配到的数量返回值[整数型]: 返回匹配数量,如未创建则返回-1Function 取匹配数量()
If IsObject(Matches) = True Then
取匹配数量 = Matches.Count
取匹配数量 = - 1
End Function
复制代码[backcolor=rgb(247, 247, 247)]函数:
取匹配文本函数说明: 取出正则表达式匹配到的文本参数说明: 匹配索引[整数型]: 索引值从1开始返回值[文本型]: 返回匹配文本,如未创建则返回空文本Function 取匹配文本(匹配索引)
Dim 匹配数量
If IsObject(Matches) = True Then
匹配数量 = Matches.Count
If 匹配数量 > 0 and 匹配索引 <= 匹配数量 Then
Set Match = Matches.Item(匹配索引 - 1)
取匹配文本 = Match.Value
Set Match = Nothing
取匹配文本 = ""
取匹配文本 = ""
End Function
复制代码[backcolor=rgb(247, 247, 247)]函数:
取匹配文本起始位置函数说明: 返回匹配文本在整个被搜索文本中的起始位置。参数说明: 匹配索引[整数型]: 索引值从1开始返回值[整数型]: 返回匹配文本起始位置,如未创建则返回-1Function 取匹配文本起始位置(匹配索引)
Dim 匹配数量
If IsObject(Matches) = True Then
匹配数量 = Matches.Count
If 匹配数量 > 0 and 匹配索引 <= 匹配数量 Then
Set Match = Matches.Item(匹配索引 - 1)
取匹配文本起始位置 = Match.FirstIndex + 1
Set Match = Nothing
取匹配文本起始位置 = -1
取匹配文本起始位置 = - 1
End Function
复制代码[backcolor=rgb(247, 247, 247)]函数:
取子匹配文本函数说明: 取出正则的子表达式匹配到的文本参数说明: 匹配索引[整数型]: 索引值从1开始子表达式索引[整数型]: 欲取其值的子表达式索引,索引从1开始。返回值[文本型]: 返回子匹配文本,如未创建或索引值超出范围则返回空文本Function 取子匹配文本(匹配索引, 子表达式索引)
Dim 匹配数量, 子匹配数量
If IsObject(Matches) = True Then
匹配数量 = Matches.Count
If 匹配数量 > 0 and 匹配索引 <= 匹配数量 Then
Set Match = Matches.Item(匹配索引 - 1)
Set SubMatches = Match.SubMatches
子匹配数量 = SubMatches.Count
If 子匹配数量 > 0 and 子表达式索引 <= 子匹配数量 Then
取子匹配文本 = SubMatches.Item(子表达式索引 - 1)
取子匹配文本 = ""
Set Match = Nothing
Set SubMatches = Nothing
取子匹配文本 = ""
取子匹配文本 = ""
End Function
复制代码[backcolor=rgb(247, 247, 247)]函数:
取子匹配数量函数说明: 取出正则的子表达式匹配到的数量返回值[整数型]: 返回子匹配数量,如未创建或匹配数量等于0则返回-1Function 取子匹配数量()
If IsObject(Matches) = True Then
匹配数量 = Matches.Count
If 匹配数量 > 0 Then
Set Match = Matches.Item(0)
Set SubMatches = Match.SubMatches
取子匹配数量 = SubMatches.Count
Set Match = Nothing
Set SubMatches = Nothing
取子匹配数量 = - 1
取子匹配数量 = - 1
End Function
复制代码[backcolor=rgb(247, 247, 247)]函数:
取正则结果到数组函数说明: 将匹配到的结果保存到一个二维数组里返回值[数组]: 返回一个二维数组,第二维的第一个元素保存匹配文本,第二个元素开始到最后一个元素保存子匹配文本举例: 结果=取正则结果到数组(),那么, 结果(0,0) 为第1个匹配文本(数组是从0开始) ,结果(0,1) 为第1个匹配文本的第1个子匹配文本,结果(0,1) 为第1个匹配文本的第2个子匹配文本 ,以此类推Function 取正则结果到数组()
Dim 匹配数量, 子匹配数量, i, n
If IsObject(Matches) = True Then
匹配数量 = Matches.Count
If 匹配数量 > 0 Then
Set Match = Matches.Item(0)
Set SubMatches = Match.SubMatches
子匹配数量 = SubMatches.Count
Redim 正则结果(匹配数量 - 1, 子匹配数量)
Set Match = Nothing
Set SubMatches = Nothing
For i = 0 To 匹配数量 - 1
Set Match = Matches.Item(i)
Set SubMatches = Match.SubMatches
正则结果(i, 0) = Match.Value
For n = 1 To 子匹配数量
正则结果(i, n) = SubMatches.Item(n - 1)
Set Match = Nothing
Set SubMatches = Nothing
Redim 正则结果(- 1 , - 1 )
Redim 正则结果(- 1 , - 1 )
取正则结果到数组 = 正则结果
End Function
复制代码[backcolor=rgb(247, 247, 247)]函数:
正则匹配函数说明: 用一个正则表达式来匹配一个文本,本方法为独立对象。参数说明: 参数部分解释参考: 创建返回结果: 伪多维数组(A)(B)(C)匹配文本: 数组(0)(n), n为匹配索引匹配子文本: 数组(1)(n)(i), n为匹配索引, i为子匹配索引Function 正则匹配(正则表达式, 被搜索文本, 忽略大小写, 匹配多行, 全局匹配)
Dim i, n, Matches, SubMatches, Match, OutArr(1)
//创建正则
Set TmpRegEx = New RegExp
TmpRegEx.IgnoreCase = 忽略大小写
TmpRegEx.Multiline = 匹配多行
Execute "TmpRegEx.Global = True" & 全局匹配
TmpRegEx.Pattern = 正则表达式
Set Matches = TmpRegEx.Execute(被搜索文本)
//正则结果到数组
Redim Tmp_Matches(Matches.Count - 1)
Redim Tmp_Sub_Arr(Matches.Count - 1)
For i = 0 To Matches.Count - 1
Redim Tmp_SubMatch(Matches(i).SubMatches.Count - 1)
For n = 0 To Matches(i).SubMatches.Count - 1
Tmp_SubMatch(n) = Matches(i).SubMatches(n)
Tmp_Matches(i) = Matches(i)
Tmp_Sub_Arr(i) = Tmp_SubMatch
OutArr(0) = Tmp_Matches
OutArr(1) = Tmp_Sub_Arr
//输出结果并释放对象
Set TmpRegEx = Nothing
Set Matches = Nothing
正则匹配 = OutArr
End Function
复制代码[backcolor=rgb(247, 247, 247)]函数:
正则替换函数说明: 通过正则表达式替换匹配的文本,本方法为独立对象。参数说明: 参数部分解释参考: 创建,替换返回值[文本型]: 返回替换结果Function 正则替换(正则表达式, 被搜索文本, 替换文本, 忽略大小写, 匹配多行, 全局匹配)
//创建正则
Set TmpRegEx = New RegExp
TmpRegEx.IgnoreCase = 忽略大小写
TmpRegEx.Multiline = 匹配多行
Execute "TmpRegEx.Global = True" & 全局匹配
TmpRegEx.Pattern = 正则表达式
//输出结果并释放对象
正则替换 = TmpRegEx.Replace(被搜索文本, 替换文本)
Set TmpRegEx = Nothing
End Function
复制代码.如有问题,请联系 QQ 暗号: 正则接单群 6820131
承接:各类游戏辅助,网页,Post,办公脚本,验证码,注册机,手机脚本,插件定制,软件定制等业务!QQ: 接单群:6820131
按键精灵开发者4级可通过提升认证等级来升级勋章:
果然还是回复可见啊,顶你,这些对我很有用哦 谢谢大神
幸运草勋章(永久)商业小精灵限时活动勋章。鹰眼勋章鹰眼注册用户专属勋章认证考霸(90天)参加考霸活动,对认证考了十次以上用户的鼓励按键精灵开发者4级可通过提升认证等级来升级勋章:学有所成学有所成勋章,新手步入按键学堂的第一枚勋章论坛GG按键论坛男性用户勋章马年勋章(360天) 马年纪念勋章(360天)十周年勋章(360天)十周年纪念勋章按键卫士(90天)参与“打击山寨,维护按键”活动抢楼达人(30天)参与抢楼活动黄瓜勋章(永久)体验商业小精灵活动的奖励双蛋勋章(30天)双蛋活动勋章(30天)月全勤论坛自然月(如8.1-8.31)签到满勤,系统会在月底自动判断发放。
感谢楼主的分享,学习一下
按键精灵开发者2级可通过提升认证等级来升级勋章:
谢谢楼主,非常感谢
如果觉对你有所帮助,请无私奉献一朵小花给我。
I can't thank you enough.
我对你感激不尽
学有所成学有所成勋章,新手步入按键学堂的第一枚勋章按键精灵开发者6级可通过提升认证等级来升级勋章:黄金之翼黄金之翼勋章黄瓜勋章(永久)体验商业小精灵活动的奖励双蛋勋章(30天)双蛋活动勋章(30天)鹰眼勋章鹰眼注册用户专属勋章认证考霸(90天)参加考霸活动,对认证考了十次以上用户的鼓励
qqqqqqqqqqqq
&a href=&/msgrd?V=1&Uin=&Site=&Menu=yestencent://Message/?Uin=& target=&_blank&&&img id=&aimg_mP31L& onclick=&zoom(this, this.src, 0, 0, 0)& class=&zoom& src=&/pa?p=1:& onmouseover=&img_onmouseoverfunc(this)& onload=&thumbImg(this)& border=&0& alt=&& /&&/a&
按键精灵开发者4级可通过提升认证等级来升级勋章:学有所成学有所成勋章,新手步入按键学堂的第一枚勋章论坛MM按键论坛女性用户勋章黄瓜勋章(永久)体验商业小精灵活动的奖励幸运草勋章(永久)商业小精灵限时活动勋章。认证考霸(90天)参加考霸活动,对认证考了十次以上用户的鼓励月全勤论坛自然月(如8.1-8.31)签到满勤,系统会在月底自动判断发放。
永无止境!
认证考霸(90天)参加考霸活动,对认证考了十次以上用户的鼓励按键精灵开发者5级可通过提升认证等级来升级勋章:小红帽对论坛提出良好建议(可向管理员申请)学有所成学有所成勋章,新手步入按键学堂的第一枚勋章
前来观看!!! 。。。。
按键精灵开发者4级可通过提升认证等级来升级勋章:
黄瓜勋章(永久)体验商业小精灵活动的奖励学有所成学有所成勋章,新手步入按键学堂的第一枚勋章按键精灵开发者6级可通过提升认证等级来升级勋章:
看看 ,一直不懂什么叫正则表达式!
认真的学!
盒子会员盒子会员专属勋章按键会员(月)按键会员绑定账号后自动赠送
感谢楼主的分享,学习一下
按键精灵开发者6级(新浪V认证)通过新浪微博加V后自动发放,并替换普通的认证6级勋章。
悠悠顾红帆
yanggenius
学有所成学有所成勋章,新手步入按键学堂的第一枚勋章按键精灵开发者4级可通过提升认证等级来升级勋章:黄金之翼黄金之翼勋章天使勋章天使一样的用户按键图书勋章尊贵的按键图书用户按键14周年庆纪念勋章按键14周年庆纪念勋章(360天)月全勤论坛自然月(如8.1-8.31)签到满勤,系统会在月底自动判断发放。
通用的正则表达式
幸运草勋章(永久)商业小精灵限时活动勋章。按键精灵开发者6级可通过提升认证等级来升级勋章:
好像很有用!谢了!!
幸运草勋章(永久)商业小精灵限时活动勋章。按键精灵开发者4级可通过提升认证等级来升级勋章:学有所成学有所成勋章,新手步入按键学堂的第一枚勋章黄瓜勋章(永久)体验商业小精灵活动的奖励鹰眼勋章鹰眼注册用户专属勋章认证考霸(90天)参加考霸活动,对认证考了十次以上用户的鼓励马年勋章(360天) 马年纪念勋章(360天)
乄魅力baobei
正则表达式命令库源码 (回复可见)
按键精灵开发者4级可通过提升认证等级来升级勋章:黄瓜勋章(永久)体验商业小精灵活动的奖励
↑體諒你眼睛 字體放大處理↑

我要回帖

更多关于 网页链接的正则表达式 的文章

 

随机推荐