首页 > 解决方案 > 从 HTML 和 JS 源中提取 URL,一行中有多个

问题描述

我想列出我们的源代码引用的所有域,允许仅查找那些静态引用并以 https?:// 开头的域。例如,我尝试了以下方法:

find -s [^.]* -print0 | xargs -0 sed -En 's/.*https?:\/\/([a-z0-9\-\.\_]+).*/\1/p' | sort | uniq

错误是,当一行中有多个域时,只会返回一个。可以用简单的shell 工具来解决这个问题,即不完全解析HTML 吗?

标签: javascriptregexbashzsh

解决方案


正则表达式.*是贪婪的,因此将它放在正则表达式的开头和结尾将丢弃同一行上的任何其他 URL。

标准grep无法打印捕获组,如([a-z0-9-._]+),但如果有perl,请替换:

sed -En 's/.*https?:\/\/([a-z0-9\-\.\_]+).*/\1/p'

有了这个:

perl -nle 'print $1 while m{https?://([a-z0-9-._]+)}g'
  • https?://([a-z0-9-._]+)是我们新的正则表达式,它只匹配我们正在寻找的内容,保持每一行的完整性。
  • while m{...}g遍历正则表达式的每个匹配项。
  • print $1显示我们的正则表达式的第一个捕获([a-z0-9-._]+)

您的最终命令将是:

find -s [^.]* -print0 | xargs -0 perl -nle 'print $1 while m{https?://([a-z0-9-._]+)}g' | sort | uniq

推荐阅读