1

我有以下字符串:

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

我想把它分成3个字符串。
一个有“我的名字”:
一个有“John Smith”
,一个有其余的文本,即大文本的其余部分 bla bla bla
问题是“John Smith”是一个变体。即可以是任何名称,我想提取它。
我尝试过类似的方法:
my @vals = split (/(<b>My Name: John Smith :*+<br >)/, $string); 但这甚至无法编译。
我如何在 Perl 中做到这一点?

4

4 回答 4

3

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

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

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

顺便说一句,您是否注意到字符串包含字符 U+2026?

于 2013-08-15T15:24:22.857 回答
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 .'
        ];
于 2013-08-15T18:51:09.867 回答
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;
}
于 2013-08-15T15:51:58.807 回答
0

使用正则表达式和预定义变量“ $' ”,它指的是字符串中匹配正则表达式的部分之后的部分!

于 2013-08-16T05:34:20.863 回答