1

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

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

考虑到有多个级别的动画化。如何获取文本 TEXT_TO_FIND?

用简单的英语,我需要做的是获取“最后一个后面有文本 KEY”和“文本 KEY”之间的文本,它只在文档上出现一次。

注意1:我发现了这个问题,但似乎没有用;我一直得到一个空的结果。这将是表达式:

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

Note2:如果我从前一个注释的表达式中删除 KEY,我会从文件的最后一个到末尾的文本。

提前谢谢大家!

4

3 回答 3

1

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

然后你需要一个 HTML 解析器。正则表达式的功能不够强大,无法正确完成。

一旦你解析了 HTML 并获得了每个TAGs 的内容,你可以使用类似的东西:

/(.*)KEY/is

检查文本是否包含KEY,如果是,则获取它之前的内容。

于 2010-02-07T20:35:17.113 回答
0

如果您只是不想使用 HTML 解析器,这是一个在 TEXT_TO_FIND 不包含“<”或“>”时有效的正则表达式:

/\s*([^<>]*?)\s*?KEY/ism
于 2010-02-07T20:39:28.870 回答
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>

输出:

$ ./查找文本
TEXT_TO_FIND
于 2010-02-07T21:29:49.563 回答