在文件夹下的文件中搜索有效模式?(可能使用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
该计划的工作原理如下:
文件位于v3文件夹下。我将在任何地方运行该程序,它将检查该文件夹下的所有jsp文件(我将在编写的程序中定义该v3文件夹的整个路径)jsp
- 它将找到所有以
开头的行。好吧,类似这样的内容将使您继续:
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的
的替代品,应该能够做您想要做的事情 老实说,您不想在[xht]ml上进行模式匹配,而是想使用解析器。使用的Perl脚本可以找到具有特定属性的所有标记 下面是一个快速模型,不过您可能需要一些更有用的输出:grep
使用(因此)并向下寻找你的东西#!/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/#; } } }
然后,用相同的脚本修改HTML(即,将“/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; } }
)并用$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”))。因为存在一些有效的情况,例如在某个对象到此处之间写入脚本代码,而它被视为无效情况。对于递归,请使用
。我没有测试剩下的程序。谢谢你的回答。它是否也在v3文件夹下找到jsp文件,以及我将如何将路径作为参数提供给程序?FileUtils.iterateFiles(新文件(“/path/to/v3”)、新字符串[]{“jsp”},true);
。perl将所有命令行参数放入数组perl program.pl path
。我已经更新了脚本,允许在命令行上有多个路径。它现在还需要@ARGV
模块(可通过文件::chdir
获得)我没有测试剩下的程序。也谢谢你的回答。我会问同样的问题,它是否也在v3文件夹下找到jsp文件,以及我将如何将路径作为参数提供给程序?cpan
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 );