我有一个包含多行地址的标记,我希望将其划分为单行,以便我可以识别城市,邮政编码等。
例如
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,我怎样才能提取出来的四行文字。我感兴趣吗?
答案 0 :(得分:2)
如果您的案例(并且将永远)如您所描述的那样简单,那么我会坚持使用正则表达式。在你哭泣并释放我的狗之前,想一秒钟:
是的,正则表达式无法解析HTML。但是我们这里没有解析HTML。我们正在<div>
内解析一个非常非常的HTML小部分,这很容易通过一个简单的正则表达式来处理。对我来说,使用一个完整的解析库就像使用大锤来破解核桃一样。
我会亲自将你的正则表达式升级到m!<\s*br\s*/?\s*>!
以捕获(稍微)损坏的HTML,并且,就像任何事情一样, test 可以将每个有效和无效的输入放在一起。