【问题标题】:How would I remove all <script> tags (and everything in between) from multiple files using UNIX?如何使用 UNIX 从多个文件中删除所有 <script> 标签(以及介于两者之间的所有标签)?
【发布时间】:2011-01-21 16:46:56
【问题描述】:

我有一个包含多个文件的文件夹,我想删除所有 &lt;script&gt; 标签以及介于两者之间的所有内容,例如:

这个:

<script type="text/javascript">function(foo);</script>

还有这个:

<script type="text/javascript" src="scripts.js"></script>

我认为在 PHP 中应该是这样的:

<?php $string = preg_replace('#(\n?<script[^>]*?>.*?</script[^>]*?>)|(\n?<script[^>]*?/>)#is', '', $string); ?>

但我对 UNIX 不知所措。

【问题讨论】:

  • 您只是想删除脚本标签,还是删除文档中的所有 JavaScript?仅删除脚本标签仍然会留下很多脚本可以运行的方式;你可以在这里看到一堆:ha.ckers.org/xss.html
  • 在这种特殊情况下,所有的 JavaScript 都在标签之间。

标签: regex perl unix


【解决方案1】:

例如傻瓜

$ cat file
blah
<script type="text/javascript">function(foo);</script>
<script type="text/javascript" src="scripts.js"></script>
blah
<script type="text/javascript"
    src="script1.js">
</script>
end

$ awk 'BEGIN{RS="</script>"}/<script/{gsub("<script.*","")}{print}END{if(RS=="")print}' file
blah




blah


end

所以在 for 循环中运行它来检查你的文件(例如 html)

for file in *.html
do
  awk 'BEGIN{RS="</script>"}/<script/{gsub("<script.*","")}{print}END{if(RS=="")print}' $file >temp
  mv temp $file
done

你也可以用 Perl 来做,

perl -i.bak -0777ne 's|<script.*?</script>||gms;print' *.html

【讨论】:

  • 我选择了 perl 路线,在我想要完成的任务中,它运行良好。谢谢!
【解决方案2】:

您有机会获得此权利的唯一方法是将文件(我假设它是一个 HTML 文件)加载到 HTML/XML 解析器中并以这种方式删除脚本节点。任何其他方式都可能与包含“

<script>
    document.write('</script>');
</script>

【讨论】:

  • 实际上,浏览器 DOM 解析器会以与正则表达式相同的方式解释这一点——第一个 作为脚本节点的实际结尾。但是在 HTML 上使用正则表达式仍然是一个坏主意。 codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html
  • @Annie,公平点,当我写这个的时候,我已经半醒了,但是是的,“不要在 HTML 上使用正则表达式”这一点仍然存在 :)
【解决方案3】:

我会使用 HTML::TreeBuilder 之类的东西,并在我遍历树时删除所有 SCRIPT 节点:

#!/usr/local/perls/perl-5.10.1/bin/perl

use 5.010;

use HTML::TreeBuilder;

my $html = HTML::TreeBuilder->new;
my $root = $html->parse_file( *DATA );

my @queue = ( $root->elementify );

while( my $element = shift @queue )
    {
    foreach ( $element->content_list )
        {
        when ( ! ref ) { 1 }
        when ( $_->tag eq 'script' )
            {
            $_->delete;
            }
        default
            {
            push @queue, $_
            }
        }
    }

print $html->as_HTML;

__END__
<html>
<head>
    <title>This is a title</title>
    <script>
    code section 1
    </script>
</head>

<body>
<h1>This is a heading</h1>
    <script>
    code section 2
    </script>

<div>
    <script>
    code section 
    </script>
</div>

</body>
</html>

【讨论】:

    【解决方案4】:

    您可以使用 perl 替换许多文件中的字符串。

    perl -pi -w -e 's/search/replace/g;' *.html
    
    -e means execute the following line of code.
    -i means edit in-place
    -w write warnings
    -p loop
    

    你必须想出你的正则表达式。 (你拥有的应该可以工作。)

    【讨论】:

    • 提问者还希望定位 以及介于两者之间的所有内容。
    • 嗯,是的,不纠正转义字符,
    【解决方案5】:

    你可以从命令行运行 PHP,或者很容易地将该行翻译成 perl(“preg_replace”中的“p”)。您可以使用 sed 做类似的事情,但正则表达式没有那么灵活。正则表达式可能不够好,也可能不够好,具体取决于您的输入来自哪里以及您的目标是什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      • 2015-12-26
      • 2012-11-19
      相关资源
      最近更新 更多