2011-09-27 64 views
1

下面是代碼:Perl如何去掉嵌套的bbcode標籤?

use perl5i::2; 

my $string = '[size 9]Some larger text. [i]Italic[/i] here.[/size]And [b]bold[/b] text.'; 
$string =~ s/\[(.+).*?\](.+)\[\/\1\]/$2/gi; 

$string->say; 

其結果是在這裏:

一些較大的文本。 [i]斜體[/ i] here.And粗體文本。

是否有一個正則表達式去掉標籤?

+0

聽起來像你實際上想剝離除嵌套的bbcode標籤之外的所有東西。那是對的嗎? – ikegami

+0

@ikegami,我想他是說這是他得到的結果,而不是他想要的結果。他想剝離所有的標籤。 – cjm

+0

就像@ikegami所說的,去掉所有的bbcode標籤。 – Weiyan

回答

2

如果您只想剝離標籤,您並不需要確保標籤匹配:只需刪除方括號內的任何內容即可。

如果檢查嵌套真的很重要,那麼可以簡單地重複應用當前替換。

+0

你的意思是把它放在while循環中嗎? – Weiyan

+0

@Weiran,正好。 –

1

是否要去除所有標籤?元素可以嵌套,但標籤不能嵌套,所以沒有什麼真的。

s/\[[^\[\]]*\]//g; 
+0

此代碼可以去除所有標籤。但我只想剝離匹配的標籤對。 – Weiyan

1

Parse::BBCode怎麼樣?

更新:

您不需要使用此模塊輸出HTML。而不是嘗試以下操作:

#!/usr/bin/perl 

use strict; 
use warnings; 

use Parse::BBCode; 

my %tags = map { $_ => '%s' } qw(
    b i u color size font highlight left right center indent email url thread post 
    list img video code php html quote noparse attach bug PGN2 PGN3 threadvb wiki 
); 
my $parser = Parse::BBCode->new ({ tags => \%tags }); 

my $string = '[size="9"]Some larger text. [i]Italic[/i] here.[/size]And [b]bold[/b] text.'; 
my $rendered = $parser->render($string); 

print "$rendered\n"; 

這樣,您就不必解析自己的任何文字,這是一件好事™。

+0

在這個階段,我只是閱讀論壇帖子並寫入一個javascitpt文件,如XML :: RSS :: JavaScript。在這個階段,清理乾淨就足夠了。 – Weiyan

+0

@Weiyan:看到這個例子。它乾淨地去除文本中的任何標籤。你不必保持一個正則表達式... –