在perl的下一行中查找正则表达式

时间:2015-09-21 05:42:43

标签: regex perl

我的内容就是这种形式:

<tr>    
    <td width="50%" align="right" valign="middle">Email </td> 
    <td width="50%" align="center" valign="middle"> unique@gmail.com </td>
</tr>
<tr>    
    <td width="50%" align="right" valign="middle">Code </td>
    <td width="50%" align="center" valign="middle">twenty</td>
</tr>
 <tr>   
    <td width="50%" align="right" valign="middle">Code12 </td>
    <td width="50%" align="center" valign="middle">forty</td>
</tr>

如果我想提取“二十”即与“代码”相关的数据,我应该使用什么正则表达式

我试图提取整行,但是空响应

$c=$m->content();
($a) = $c =~ /Code(.*?)tr>/;
print "$a\n";

1 个答案:

答案 0 :(得分:1)

不要试图用正则表达式解析HTML,这样疯狂和非常破碎的代码就在于此。而是使用现有的XML工具。要在HTML中搜索(可以视为XML),请使用XPath。有许多Perl实现。我建议XML::LibXML使用快速且维护良好的libxml2 C库。

以下是您如何获取&#34; Code&#34;旁边的单元格内容的示例。细胞

use v5.10;
use strict;
use warnings;

use XML::LibXML;

# Parse the HTML into an XML::LibXML::Document
my $parsed_html = XML::LibXML->load_html( string => <<'HTML');
<tr>    
    <td width="50%" align="right" valign="middle">Email </td> 
    <td width="50%" align="center" valign="middle"> unique@gmail.com </td>
</tr>
<tr>    
    <td width="50%" align="right" valign="middle">Code </td>
    <td width="50%" align="center" valign="middle">twenty</td>
</tr>
 <tr>   
    <td width="50%" align="right" valign="middle">Code12 </td>
    <td width="50%" align="center" valign="middle">forty</td>
</tr>
HTML

# Find all the rows where the first cell contains "Code" ignoring whitespace.
my @code_rows = $parsed_html->findnodes(q{//tr[normalize-space(td[1])='Code']});

# In each of the Code rows, get the value of the second cell.
for my $row (@code_rows) {
    say $row->findvalue(q{td[2]});
}

XML :: LibXML和XPath很大,但如果您要使用HTML和XML,它们非常值得投资。它可以节省您无休止的时间来调试您的正则表达不会处理的所有特殊情况。您需要的大部分内容都在XML::LibXML::Node