在给出的html文件中查找src匹配的文件,并将文件保存到本地。保存的路径是以src地址中的directory为路径,filename为文件名。
- 使用正则表达式从src提取文件路径。
const srcRegex = /src=['"]([^'"]+\.(png|jpe?g|mp4|pdf))['"]/gi;
这正则表达式是用来从 HTML 标签的 src
属性中提取文件路径的:
-
src=['"]
:匹配src=
后面紧跟着单引号'
或双引号"
的部分。 -
([^'"]+\.(png|jpe?g|mp4|pdf))
:这是一个捕获组,用于匹配文件路径,具体解释如下:[^'"]+
:匹配任意数量的字符,但不包括单引号'
或双引号"
,以保证匹配的是完整的路径。\.
:匹配文件扩展名之前的点号。(png|jpe?g|mp4|pdf)
:一个捕获组,用于匹配文件的扩展名,这里包括了 png、jpeg 或 jpg、mp4、pdf。
-
['"]
:匹配单引号'
或双引号"
。
整个正则表达式使用 gi
修饰符:
g
:表示全局匹配,会匹配到所有符合条件的部分。i
:表示不区分大小写,即对大小写不敏感。
这样,使用这个正则表达式,可以从包含 src
属性的 HTML 标签中提取出文件路径。如果有多个匹配,可以通过循环匹配结果数组来获取每个匹配项的文件路径。
- 判断src是不是有效文件地址
var httpRegex = /^(https?:\/\/)?([\w-]+(\.[\w-]+)+)/;
httpRegex
是一个正则表达式,用于匹配 HTTP 或 HTTPS 路径:
^
:表示匹配字符串的开头。(https?:\/\/)?
:这是一个可选的非捕获组,用于匹配 URL 中的 "http://" 或 "https://"。s?
表示 "s" 字符是可选的,:\/\/
匹配 "://"。([\w-]+(\.[\w-]+)+)
:这是一个捕获组,用于匹配域名部分。具体解释如下:[\w-]+
:匹配域名中的一个或多个字母、数字、下划线或短横线。(\.[\w-]+)+
:这是一个嵌套的捕获组,用于匹配顶级域名和后面的点加上一个或多个字母、数字、下划线或短横线的组合。整体表示匹配域名中的一个或多个点分隔的部分。
()
:捕获组,用于捕获整个匹配的部分,即整个域名部分。
在这个正则表达式中,httpRegex
的目标是匹配 URL 中的 HTTP 或 HTTPS 部分(如果有),以及域名部分。这样,如果匹配成功,你就可以通过访问 match
数组的不同索引来获取捕获的内容,例如 match[0]
获取整个匹配的字符串,match[2]
获取域名部分。
- 获取文件流写入本地文件
https.get(srcUrl, response => {
response.pipe(fs.createWriteStream(localDir +'/' +path.basename(srcUrl)));
});
在 Node.js 中,pipe
是一个用于将可读流(Readable Stream)连接到可写流(Writable Stream)的方法。它的语法如下:
readableStream.pipe(writableStream);
这行代码的作用是将从 readableStream
可读流中读取的数据传输到 writableStream
可写流中。这是一种高效处理流的方式,特别是当你从一个地方读取数据,然后直接将其写入另一个地方时,比如从一个文件读取数据并将其写入另一个文件。
response.pipe(fs.createWriteStream(localDir + '/' + path.basename(srcUrl)));
response
是一个可读流,它从某个 HTTP 请求获取的。fs.createWriteStream(localDir + '/' + path.basename(srcUrl))
创建了一个可写流,它将数据写入文件系统中指定路径的文件。
通过 pipe
方法,response
流中的数据被传输到文件系统中的文件中。这是一种常见的用法,特别是在处理大量数据时,因为它有效地控制了内存的使用。