在文件夹下的文件中搜索有效模式?(可能使用Perl或Java上的某些API或任何其他工具)

在文件夹下的文件中搜索有效模式?(可能使用Perl或Java上的某些API或任何其他工具),java,regex,perl,jsp,pattern-matching,Java,Regex,Perl,Jsp,Pattern Matching,我有一个文件夹,它的名字是v3。该文件夹中有jsp文件,v3文件夹中也有一些文件夹,该文件夹中也有jsp文件 我的jsp文件夹有如下链接: <link rel="stylesheet" href="/static/css/main.css" type="text/css" /> <link rel="stylesheet" type="text/css" href="/css<s:text name="scripts"/>/general_styles.css"&g

我有一个文件夹,它的名字是
v3
。该文件夹中有jsp文件,v3文件夹中也有一些文件夹,该文件夹中也有jsp文件

我的jsp文件夹有如下链接:

<link rel="stylesheet" href="/static/css/main.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="/css<s:text name="scripts"/>/general_styles.css">
<link rel="stylesheet" type="text/css" href="/v3/css<s:text name="scripts"/>/something.css" >
对于脚本:

src
也应以
/static/
开头,例如这是有效的:

<link rel="stylesheet" href="/static/css/main.css" type="text/css" />
<script language="javascript" type="text/javascript" src="/static/scripts/jquery-1.4.2.min.js"></script>

我想做的是检测哪些文件具有无效的定义

编辑:有效-无效是我公司系统的概念。我们正在将css和js文件夹移动到另一个文件夹,它们将位于一个文件夹下,该文件夹的名称为v3

该计划的工作原理如下:

  • jsp
    文件位于v3文件夹下。我将在任何地方运行该程序,它将检查该文件夹下的所有jsp文件(我将在编写的程序中定义该v3文件夹的整个路径)


  • 它将找到所有以
    开头的行。好吧,类似这样的内容将使您继续:

    public static void main(String[] args) throws IOException {
        Iterator<File> files = FileUtils.iterateFiles(new File("/path/to/v3"), new String[]{"jsp"}, true);
        while (files.hasNext()) {
            File jsp =  files.next();
            List<String> list = FileUtils.readLines(jsp);
            for (String line : list) {
                if(line.startsWith("<link") || line.startsWith("<script")) {
                    if(!line.contains("/static")) {
                        throw new RuntimeException("invalid file found: " + jsp.getAbsolutePath());
                    }
                }
            }
        }
    }
    
    publicstaticvoidmain(字符串[]args)引发IOException{
    Iterator files=FileUtils.iterateFiles(新文件(“/path/to/v3”),新字符串[]{“jsp”},true);
    while(files.hasNext()){
    File jsp=files.next();
    List=FileUtils.readLines(jsp);
    用于(字符串行:列表){
    如果(line.startsWith(“您可能会研究它,那么它是基于Perl的
    grep
    的替代品,应该能够做您想要做的事情

    老实说,您不想在[xht]ml上进行模式匹配,而是想使用解析器。使用的Perl脚本可以找到具有特定属性的所有标记

    下面是一个快速模型,不过您可能需要一些更有用的输出:

    #!/usr/bin/perl
    
    use strict;
    
    use warnings;
    
    use File::chdir;
    use Cwd 'abs_path';
    
    use HTML::TokeParser;
    
    my @paths = @ARGV;
    my @files;
    
    foreach my $path (@paths) {
      local $CWD = $path;
      opendir( my $dh, $CWD);
      push @files, map { abs_path($_) } grep {/\.jsp$/} readdir $dh;
    }
    
    foreach my $file (@files) {
      my $parser = HTML::TokeParser->new($file);
    
      while (my $tag = $parser->get_tag("link", "script")) {
    
        if ($tag->[0] eq "link" and exists $tag->[1]{'href'}) {
          print "$file\n" unless $tag->[1]{'href'} =~ m#^/static/#;
    
        } elsif ($tag->[0] eq "script" and exists $tag->[1]{'src'}) {
          print "$file\n" unless $tag->[1]{'src'} =~ m#^/static/#;
        }
    
      }  
    
    }
    
    使用(因此)并向下寻找你的东西

    use strict;
    use warnings;
    use 5.012;
    
    use HTML::TreeBuilder;
    
    my @filelist = @ARGV; ### or some other method ofc.
    
    for my $file (@filelist) {
      my $tree = HTML::TreeBuilder->new_from_file($file)->elementify;
      for my $e ( $tree->look_down( '_tag' => 'link',
                                    sub { !($_[0]->attr('href') =~ |^/static/|) }
                                  ) 
                ) {
        say "$file: ", $e->as_HTML;
      }
    }
    
    然后,用相同的脚本修改HTML(即,将“/static/”连接到错误属性的前面--
    $e->attr('href')='/static/”。$e->attr('href')
    )并用
    HTML::Tidy->new->clean($tree->as_-HTML)将其吐出也是非常简单的

    编辑:如果您对文件列表有疑问,将ARGV指定给文件列表只是因为它与问题相切。请参见示例。我会使用:


    这将在起始目录中递归(通过参数传递——如果愿意,也可以将它们直接分配给@rootdirs)并将其中的所有.jsp文件作为@filelist中的项目提供给您。

    您应该重新表述您的问题。v3文件夹和/静态链接之间的关系不清楚,我也不知道哪些是有效的/无效的。您想用java、JS、EL或jsp实现您的目标吗?@Uwe我已经编辑了我的问题。这些问题中有好的answe吗rs帮助你?你仍然有问题吗?@Joel我测试了用Java编写的答案,它可以工作,但是我也想测试Perl,但还不能。我正在测试代码。还有:org.apache.commons.lang下的StringUtils和FileUtils.readLines(jsp)行;应该用try-catch括起来。谢谢你的回答。还有一个。在if(!line.contains(“/static”))之前,应该有一个控件if(line.contains(“src”)| | line.contains(“href”))。因为存在一些有效的情况,例如在某个对象到此处之间写入脚本代码,而它被视为无效情况。对于递归,请使用
    FileUtils.iterateFiles(新文件(“/path/to/v3”)、新字符串[]{“jsp”},true);
    。我没有测试剩下的程序。谢谢你的回答。它是否也在v3文件夹下找到jsp文件,以及我将如何将路径作为参数提供给程序?
    perl program.pl path
    。perl将所有命令行参数放入数组
    @ARGV
    。我已经更新了脚本,允许在命令行上有多个路径。它现在还需要
    文件::chdir
    模块(可通过
    cpan
    获得)我没有测试剩下的程序。也谢谢你的回答。我会问同样的问题,它是否也在v3文件夹下找到jsp文件,以及我将如何将路径作为参数提供给程序?
    use strict;
    use warnings;
    use 5.012;
    
    use HTML::TreeBuilder;
    
    my @filelist = @ARGV; ### or some other method ofc.
    
    for my $file (@filelist) {
      my $tree = HTML::TreeBuilder->new_from_file($file)->elementify;
      for my $e ( $tree->look_down( '_tag' => 'link',
                                    sub { !($_[0]->attr('href') =~ |^/static/|) }
                                  ) 
                ) {
        say "$file: ", $e->as_HTML;
      }
    }
    
    use File::Find;
    my @rootdirs = @ARGV or die "Please pass all root directories to search as arguments!";
    my @filelist = find( sub { /\.jsp$/ or return; }, @rootdirs );