2011-03-03 38 views
1

我只想保留文件名(不是完整路径)并将文件名添加到某些bbcode。

这里是要转换的HTML:

<a href=/path/to/full/image.jpg rel=prettyPhoto><img rel=prettyPhoto src=/path/to/thumb/image.jpg /></a> 

通知我不能有相对=“富”(没有双引号)..

这是我在PERL,执行转换:

s/\<a href=(.+?)\ rel=prettyPhoto\>\<img rel=prettyPhoto src=(.+?) \/>\<\/a\>/\[box\]$1\[\/box\]/gi; 

这将HTML转换为:

[box]/path/to/image.jpg[/box] 

但是,这是我想要的结果:

[box]image.jpg[/box] 

的HTML必须保持不变。那么,如何更改我的PERL,使$ 1只包含文件名?

回答

1
s/\<a href=(?:.*\/)?(.+?)\ rel=prettyPhoto\>\<img rel=prettyPhoto src=(.+?) \/>\<\/a\>/\[box\]$1\[\/box\]/gi; 

(?:.*\/)?

将由/匹配最长的部分整理。最后的?使这个可选。

+0

这个工作最适合我,我首选的解决方案 - 我不得不做这一切的正则表达式。非常感谢,我在这里约2小时!在那一点上...... – Scott 2011-03-03 16:05:32

0

不要捕捉整个事情。使用(?:...)的非捕获组。这样,您可以进一步细分您匹配的部分和您捕获的部分。

0

这显然不适用于正则表达式,但您可以运行$ 1上的split函数并获取结果数组的最后一个元素。

0

什么:

s/\<a href=.*\/(.+?)\ rel=prettyPhoto\>\<img rel=prettyPhoto src=(.+?) \/>\<\/a\>/\[box\]$1\[\/box\]/gsi; 
1

我不知道,如果它处理边缘的情况下,但我得到了这个工作:

#!/usr/bin/perl 

use strict; 
use warnings; 

my $in = '<a href=/path/to/full/image.jpg rel=prettyPhoto><img rel=prettyPhoto src=/path/to/thumb/image.jpg /></a>'; 

$in =~ s/\<a href=.*?([^\/]+)\ rel=prettyPhoto\>\<img rel=prettyPhoto src=(.+?) \/>\<\/a\>/\[box\]$1\[\/box\]/gi; 

print $in . "\n"; 

但是,你会不会宁愿做这样的事情:

#!/usr/bin/perl 

use strict; 
use warnings; 

use HTML::TokeParser; 
my $p = HTML::TokeParser->new(\*DATA); 

my $token = $p->get_tag("a"); 
my $token_attribs = $token->[1]; 
my $bb_code; 

if ($token_attribs->{rel} eq 'prettyPhoto') { 

    my $url = $token_attribs->{href}; 
    my @split_path = split(m'/', $url); 

    $bb_code = '[box]' . $split_path[-1] . '[/box]'; 
} 

print $bb_code . "\n"; 
__DATA__ 
<a href=/path/to/full/image.jpg rel=prettyPhoto><img rel=prettyPhoto src=/path/to/thumb/image.jpg /></a> 

使用HTML解析器(如HTML::TokeParser,它有文档中的示例)来查找url为你?比依靠手工重新编排HTML好得多。

1

我建议你使用正确的工具来做,像这样的:

use HTML::PullParser; 
use URI; 

die '' . $! || [email protected] 
    unless my $p = HTML::PullParser->new(
     doc   => $doc_handle 
    , start  => 'tag, attr' 
    , report_tags => ['a'] 
    ); 

my @file_names; 
while (my $t = $p->get_token) { 
    next unless $t and my ($tag_name, $attr) = @$t; 
    next unless $attr and my $href = $attr->{href}; 
    next unless my $uri = URI->new($attr->{href}); 
    next unless my $path = $uri->path; 
    push @file_names, substr($path, rindex($path, '/') + 1); 
    # or it's safe to use a regex here: 
    # push @file_names, $path =~ m{([^/]+)$}; 
} 

Data::Dumper->Dump([ \@file_names ], [ '*file_names' ]); 

Friends don't let friends parse HTML with regexes.

相关问题