2010-02-07 98 views
1

我需要解析一个HTML文件中的字符串中最后一次出现,我已经得到的东西是这样的:获得使用正则表达式

<TAG1> 
    <TAG1> 
     TEXT_TO_FIND 
     KEY 
     <TAG1> 
     </TAG1> 
     <TAG1> 
     </TAG1> 
    </TAG1> 
</TAG1> 

考虑到有anidation的多个级别。我如何获得文本TEXT_TO_FIND?

用简单的英文,我需要做的是在文本之后出现“文本KEY之后的最后一个”和“文本KEY”之间的文本。

注1:我发现这个question,但它似乎没有工作;我一直得到一个空的结果。这将是表达:

/<TAG1>(?!.*<TAG1>)(.*)KEY/ism 

注2:如果我删除从以前的音符表达的KEY,我从去年到文件末尾的文本。

谢谢大家提前!

+4

正则表达式是不适合用于解析非正则语言。改用适当的解析器。 – Gumbo 2010-02-07 20:30:35

+0

你是对的亚当我很匆忙,对不起。这就是我所需要的: 获取“在文本之后有文本KEY的最后一个”和文本中只出现一次的“文本KEY”之间的文本。 – 2010-02-07 20:49:13

回答

0

如果你只是不想使用HTML解析器,这是如果TEXT_TO_FIND不包含“<”或作品“>”一正则表达式:

/\s*([^<>]*?)\s*?KEY/ism 
1

哼!我需要解析一个HTML文件,我有这样的东西:

然后,你需要一个HTML解析器。正则表达式不够强大,无法正确执行。

一旦你解析HTML和得到您的每一个TAG S的内容,你可以使用类似:

/(.*)KEY/is 

检查的文本是否包含KEY如果是的话,抢东西在它之前。

0

使用在其相应的上下文中的每个工具:用HTML解析器查找文本块,然后与具有正则表达式的用户进行匹配。

#! /usr/bin/perl 

use warnings; 
use strict; 

use HTML::Parser; 

my $p = HTML::Parser->new(
    api_version => 3, 
    text_h => [ 
    sub { 
     local($_) = @_; 
     print $1, "\n" if /(\S.+?)\s*\bKEY\b/s; 
    }, 
    "dtext" 
    ], 
); 

# for demo only 
*ARGV = *DATA; 

undef $/; 
$p->parse(<>); 

__DATA__ 
<TAG1> 
    <TAG1> 
     TEXT_TO_FIND 
     KEY 
     <TAG1> 
     </TAG1> 
     <TAG1> 
     </TAG1> 
    </TAG1> 
</TAG1> 

输出:

$ ./find-text 
TEXT_TO_FIND