从文本或 HTML 文件中提取所有 FTP 和 HTTP URL

从文本或 HTML 文件中提取所有 FTP 和 HTTP URL
; 示例 #3: 尝试从文本或 HTML 文件中提取
; 所有 FTP 和 HTTP URL 的有效脚本:
FileSelectFile, SourceFile, 3,, Pick a text or HTML file to analyze.
if SourceFile =
    return  ; 此时将退出.

SplitPath, SourceFile,, SourceFilePath,, SourceFileNoExt
DestFile = %SourceFilePath%\%SourceFileNoExt% Extracted Links.txt

IfExist, %DestFile%
{
    MsgBox, 4,, Overwrite the existing links file? Press No to append to it.`n`nFILE: %DestFile%
    IfMsgBox, Yes
        FileDelete, %DestFile%
}

LinkCount = 0
Loop, read, %SourceFile%, %DestFile%
{
    URLSearchString = %A_LoopReadLine%
    Gosub, URLSearch
}
MsgBox %LinkCount% links were found and written to "%DestFile%".
return


URLSearch:
; 由于在一些 URL 中内嵌有其他的 URL, 所以用这种特殊的方法进行处理:
StringGetPos, URLStart1, URLSearchString, http://
StringGetPos, URLStart2, URLSearchString, ftp://
StringGetPos, URLStart3, URLSearchString, www.

; 查找最左边的起始位置:
URLStart = %URLStart1%  ; 设置默认的起始处.
Loop
{
    ; 仅解析 "URLStart%A_Index%" 一次有助于
    ; 改善性能 (尤其在含有许多变量的脚本中):
    ArrayElement := URLStart%A_Index%
    if ArrayElement =  ; 到达伪数组的末尾.
        break
    if ArrayElement = -1  ; 此元素无效.
        continue
    if URLStart = -1
        URLStart = %ArrayElement%
    else ; URLStart 中含有有效位置,所以把它与 ArrayElement 进行比较.
    {
        if ArrayElement <> -1
            if ArrayElement < %URLStart%
                URLStart = %ArrayElement%
    }
}

if URLStart = -1  ; 在 URLSearchString 中不存在网址.
    return

; 否则,提取该网址:
StringTrimLeft, URL, URLSearchString, %URLStart%  ; 忽略开始/无效部分.
Loop, parse, URL, %A_Tab%%A_Space%<>  ; 找到首个空格,tab 或尖括号(如果有).
{
    URL = %A_LoopField%
    break  ; 即仅执行一次循环来获取首个"片段".
}
; 如果没有找到结束字符而在上面的循环中没有执行循环体,
; 那么保持网址变量的内容不变.

; 如果网址以双引号结束,那么移除它.暂时使用 StringReplace,不过注意
; 双引号似乎可以合法存在于网址中,所以这样做
; 可能破坏它们:
StringReplace, URLCleansed, URL, ",, All
FileAppend, %URLCleansed%`n
LinkCount += 1

; 看看当前行中是否含有其他网址:
StringLen, CharactersToOmit, URL
CharactersToOmit += %URLStart%
StringTrimLeft, URLSearchString, URLSearchString, %CharactersToOmit%
Gosub, URLSearch  ; 到自身的递归调用.
return

 

给TA捐赠
共{{data.count}}人
人已捐赠
其他

获取文本的最后一行

2018-1-3 13:09:01

其他

[AHK1.1+循环结构]列出对象中的键值对

2018-1-3 13:14:58

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索