2010-02-07 164 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