在perl中打破3个部分的字符串

时间:2013-08-15 15:05:02

标签: regex perl html-parsing

我有以下字符串:

my $string = "<b>My Name: John Smith < /br> </br>Rest of a big text bla bla bla …";

我想把它分成3个字符串 一个人有“我的名字:” 一个人有“约翰史密斯” 还有一个文本的其余部分,即大文本的其余部分bla bla bla 问题是“约翰史密斯”是一个变种。即可以是任何名字,我想提取它。
我尝试过类似的事情:
my @vals = split (/(<b>My Name: John Smith :*+<br >)/, $string); 但这甚至都没有编译 我如何在Perl中执行此操作?

4 个答案:

答案 0 :(得分:3)

一个简单的正则表达式应该可以工作。

my ($label, $name, $rest) = $string =~ m=<b>(.*?): (.*?) < /br> </br>(.*)=;
print "$label\n$name\n$rest\n";

请注意,</之间的空格不是HTML中的正确语法,可能无法按您的意愿呈现。

是的,你注意到字符串包含字符U + 2026?

答案 1 :(得分:1)

#!/usr/bin/env perl

use utf8;
use 5.014;
use strict;
use warnings;
use open qw(:std :utf8);

use HTML::TokeParser::Simple;

my $html = q{<b>My Name: John Smith <br /> <br />Rest of a big text bla bla bla …};

my $parser = HTML::TokeParser::Simple->new(string => $html);

while (my $tag = $parser->get_tag('b')) {
    my $text = $parser->get_text('br');
    next unless my ($label, $name) = ($text =~ m{\A (My Name:) \s+ (.+) }xs);
    $name =~ s{\s+\z}{};
    $text = $parser->get_text('/b');
    $text =~ s{\A\s+}{};
    $text =~ s{\s+\z}{};
    say "|$_|" for $label, $name, $text;
}

答案 2 :(得分:1)

my $string = "<b>My Name: John Smith < /br> </br>Rest of a big text bla bla bla …";

my @vals = 
  map { /(My Name:)\s*(.+)/ ? ($1,$2) : $_ } 
  grep length,
  split /\s* <.+?> \s*/x, $string;

use Data::Dumper; print Dumper \@vals;

输出

$VAR1 = [
          'My Name:',
          'John Smith',
          'Rest of a big text bla bla bla .'
        ];

答案 3 :(得分:0)

使用正则表达式和预定义变量&#34; $&#39; &#34;它指的是与正则表达式匹配的部分之后的字符串部分!