2011-09-27 68 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:看到这个例子。它干净地去除文本中的任何标签。你不必保持一个正则表达式... –