0

我有一个下面给出的 Perl 正则表达式,如果没有视频标签,它会返回插入视频标签中的 url。

如您所见$2,在下面的正则表达式中添加了视频标签。但我想检查 $2 的空白或空值。如果 $2 为空白,则显示一些其他文本,如“无视频”等。

所以请帮助如何检查返回$2值是否为空白并在这种情况下显示一些其他文本。

$text =~ s#(^|\s|\>)((http|https)://www.hulu.com/watch/([a-z0-9\/\-]+))#$1\[video\]$2\[\/video\]#isg;
4

1 回答 1

0

这是一种可能的方法(但我强烈 建议不要为此使用正则表达式):

my $good_text = "some text>http://www.hulu.com/watch/sdfsdf";
my $bad_text = "some text>http://www.hulu.com/watch/";

$good_text =~
s!(^|\s|\>)((?:http|https)://www.hulu.com/watch/([a-z0-9/-]*))!$1\[video\]@{[($3) ? $2 : "No video"]}\[\/video\]!isg;

$bad_text =~
s!(^|\s|\>)((?:http|https)://www.hulu.com/watch/([a-z0-9/-]*))!$1\[video\]@{[($3) ? $2 : "No video"]}\[\/video\]!isg;

print "Good '$good_text'\n";
print "Bad '$bad_text'\n";


$good_text = "some text>http://www.hulu.com/watch/sdfsdf";
$bad_text = "some text>http://www.hulu.com/watch/";

#below is the right way for such things -- using /e switch and function call    
$good_text =~
s!(^|\s|\>)((?:http|https)://www.hulu.com/watch/([a-z0-9/-]*))!check_result($1, $2, $3)!isge;

$bad_text =~
s!(^|\s|\>)((?:http|https)://www.hulu.com/watch/([a-z0-9/-]*))!check_result($1, $2, $3)!isge;

print "Good '$good_text'\n";
print "Bad '$bad_text'\n";

sub check_result {

    my ($text, $url, $id) = @_;

    if ($id) {
        return $text . "[video]" . $url . $id . "[/video]";
    }
    else {

        return $text . "[video]No video[/video]";
    }
}
于 2013-07-21T08:59:16.450 回答