【发布时间】:2013-12-21 18:25:38
【问题描述】:
我有一个 shell sn-p 可以在数千个随机 html 页面中找到所有外部 JavaScript 脚本,它使用<script src="…" 范式来包含所述脚本,并带有绝对 URL:
find ./ -type f -print0 | xargs -0 \
perl -nle 'print $1 \
while (m%<script[^>]+((https?:)?//[-./0-9A-Z\_a-z]+)%ig);'
由于脚本也可以在 JavaScript 本身中动态加载,我想扩展我的 sn-p 以匹配任何以 .js 结尾的绝对 URL 式字符串,最好出现在 script 标记中。 (这不会 100% 准确,但可能足以找到一些额外的外部脚本案例。)
我在想<script[^>]*>.*["']((((https?)?:)?//)?[-.0-9A-Za-z]+\.[A-Za-z]{2,}/[-./0-9A-Z\_a-z]+\.js) 之类的东西,最后可能还有.*</script>。
一个棘手的部分是确保在script 中多次提及.js 会导致多个匹配(上面的正则表达式不会自己做),而且我有两个表达式没有以某种方式进行匹配,从而在输入中一次提及给定的$1 匹配字符串产生两个输出。
将这个新的正则表达式添加到我拥有的 perl sn-p 中的好方法是什么?
【问题讨论】:
-
你不会找到
<script> </script>in 外部js文件本身吗?您会发现它们在 html 页面中一个接一个地链接在一起。我唯一能看到的是解析 jQuery 的 .getScript,这在正则表达式中会简单得多。 -
@r3mus,感谢您让我注意到
.getScript,但是如果您已经拥有 jQuery,那么您不太可能使用它来加载外部脚本;这个想法是找到嵌入的第三方脚本引用之类的东西,页面的作者只是简单地复制粘贴这些东西以启用某种跟踪或其他东西。 -
即便如此,您仍然不会在 标记之间找到它。在找到无效的文件名/路径字符之前,您可能会更好地查找 .js 并进行反向引用?
-
我会避免在这里使用正则表达式,并制作一个小程序来解析 HTML 并以这种方式找到
-
@MatthewLock 绝对是一种更可靠、更全面的方法——Mojo 非常棒。也就是说,如果 cnst 已经构建了脚本,那么更改它可能是一项不必要的工作。