如何最好地根据<br/>标签解析/拆分<div>

时间:2015-09-21 22:08:46

标签: perl

我有一个包含多行地址的标记,我希望将其划分为单行,以便我可以识别城市,邮政编码等。

例如

chown -R www-data wordpress

我可以用split函数做到这一点,例如(假设地址div在变量$ text中)

<div>Ministry of Magic
    <br />Whitehall
    <br />London
    <br />SW1A 2AA
</div>

显示器

use feature 'say';
my @lines = split qr{<br\s?/>}, $text;
foreach my $line (@lines) {
    say $line;
}

但是,我很清楚using a regex to parse HTML is verboten因此我认为我尝试使用Ministry of Magic Whitehall London SW1A 2AA ,但我不确定如何抓取内容。我可以看看&#39; br&#39;标签,但它只返回HTML::TreeBuilder / HTML::Element标签本身。这并不奇怪,因为<br />元素不能包含内容,但我不知道要使用哪种语法。

<br>

显示

my $tree = HTML::TreeBuilder->new();
my @content = $tree->parse($text)->guts()->look_down(_tag => 'br');
foreach my $line (@content) {
    say $line->as_HTML;
}

所以,我的问题是:1)我应该坚持使用正则表达式还是使用HTML :: TreeBuilder,2)如果我应该使用HTML :: TreeBuilder,我怎样才能提取出来的四行文字。我感兴趣吗?

1 个答案:

答案 0 :(得分:2)

如果您的案例(并且将永远)如您所描述的那样简单,那么我会坚持使用正则表达式。在你哭泣并释放我的狗之前,一秒钟:

是的,正则表达式无法解析HTML。但是我们这里没有解析HTML。我们正在<div>内解析一个非常非常的HTML小部分,这很容易通过一个简单的正则表达式来处理。对我来说,使用一个完整的解析库就像使用大锤来破解核桃一样。

我会亲自将你的正则表达式升级到m!<\s*br\s*/?\s*>!以捕获(稍微)损坏的HTML,并且,就像任何事情一样, test 可以将每个有效和无效的输入放在一起。