从文本或 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