【问题标题】:How to apply two separate regular expressions in perl如何在 perl 中应用两个单独的正则表达式
【发布时间】: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% 准确,但可能足以找到一些额外的外部脚本案例。)

我在想&lt;script[^&gt;]*&gt;.*["']((((https?)?:)?//)?[-.0-9A-Za-z]+\.[A-Za-z]{2,}/[-./0-9A-Z\_a-z]+\.js) 之类的东西,最后可能还有.*&lt;/script&gt;

一个棘手的部分是确保在script 中多次提及.js 会导致多个匹配(上面的正则表达式不会自己做),而且我有两个表达式没有以某种方式进行匹配,从而在输入中一次提及给定的$1 匹配字符串产生两个输出。

将这个新的正则表达式添加到我拥有的 perl sn-p 中的好方法是什么?

【问题讨论】:

  • 你不会找到&lt;script&gt; &lt;/script&gt; in 外部js文件本身吗?您会发现它们在 html 页面中一个接一个地链接在一起。我唯一能看到的是解析 jQuery 的 .getScript,这在正则表达式中会简单得多。
  • @r3mus,感谢您让我注意到.getScript,但是如果您已经拥有 jQuery,那么您不太可能使用它来加载外部脚本;这个想法是找到嵌入的第三方脚本引用之类的东西,页面的作者只是简单地复制粘贴这些东西以启用某种跟踪或其他东西。
  • 即便如此,您仍然不会在 标记之间找到它。在找到无效的文件名/路径字符之前,您可能会更好地查找 .js 并进行反向引用?
  • 我会避免在这里使用正则表达式,并制作一个小程序来解析 HTML 并以这种方式找到
  • @MatthewLock 绝对是一种更可靠、更全面的方法——Mojo 非常棒。也就是说,如果 cnst 已经构建了脚本,那么更改它可能是一项不必要的工作。

标签: regex perl


【解决方案1】:

一个棘手的部分是确保在一个文件中多次提及 .js 脚本导致多个匹配项(上面的正则表达式不会这样做 本身)...

这可以通过将您考虑的正则表达式一分为二来实现——一部分用于&lt;script&gt; 标记,另一部分用于.js 匹配——并在嵌套循环中调用这些部分;嵌套是通过修饰符c 实现的,它可以防止当前行中的位置在匹配失败后重置,以及\G 锚点,在该点匹配之前的g 匹配在哪里结束

…还有我的两个表达式在某种程度上不匹配 一次提及给定的$1 匹配导致两个输出 输入中的字符串。

第一个表达式只匹配&lt;script …&gt; 标签,第二个表达式只匹配&lt;script&gt;&lt;/script&gt; 标签。

因此,您的 shell sn-p 的 perl 部分可能如下所示:

    perl -nle '
    print $1 while m%<script[^>]+((https?:)?//[-./0-9A-Z\_a-z]+)%ig;
    while (m%<script[^>]*>%ig)  # for each <script> tag
    {
     print $2 while m%          # allow multiple mentions of `.js`
     \G((?!</script>).)*?       # do not pass over </script>, be non-greedy
     ["'"'](((https?:)?//)?[-.0-9A-Za-z]+\.[A-Za-z]{2,}/[-./0-9A-Z\_a-z]+\.js)
                     %ixgc      # c: keep the Current position for outer loop
    }"

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    相关资源
    最近更新 更多