1

ファイル名のみ (フル パスではない) を保持し、ファイル名を bbcode に追加したい。

変換する HTML は次のとおりです。

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

rel="foo" (二重引用符なし) を使用できないことに注意してください。

変換を実行するために、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 は同じままである必要があります。では、$1 にファイル名だけが含まれるように PERL を変更するにはどうすればよいでしょうか?

4

6 に答える 6

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

(?:.*\/)?

/ で終わる最も長い部分に一致します。final?はこれをオプションにします。

于 2011-03-03T15:29:04.650 に答える
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 を手動で正規表現することに頼るよりもはるかに優れています。

于 2011-03-03T15:38:51.280 に答える
1

次のような、仕事に適したツールを使用することをお勧めします。

use HTML::PullParser;
use URI;

die '' . $! || $@ 
    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' ] );

友人は、友人が HTML を正規表現で解析することを許可しません。

于 2011-03-03T16:26:21.870 に答える
0

これは明らかに正規表現内では機能しませんが、$ 1でsplit関数を実行して、結果の配列の最後の要素を取得する ことができます。

于 2011-03-03T15:33:07.480 に答える
0

どうですか:

s/\<a href=.*\/(.+?)\ rel=prettyPhoto\>\<img rel=prettyPhoto src=(.+?) \/>\<\/a\>/\[box\]$1\[\/box\]/gsi;
于 2011-03-03T15:36:46.437 に答える
0

全体をキャプチャしないでください。で非キャプチャ グループを使用し(?:...)ます。このようにして、一致する部分とキャプチャする部分をさらに細分化できます。

于 2011-03-03T15:31:15.563 に答える