gpt4 book ai didi

regex - Perl 替换嵌套 block 正则表达式

转载 作者:行者123 更新时间:2023-12-05 02:23:22 26 4
gpt4 key购买 nike

我需要获取哈希数组或哈希树中的嵌套 block ,以便能够用动态内容替换 block 。我需要替换

之间的代码
<!--block:XXX-->

和第一个结束结束 block

<!--endblock--> 

我的动态内容。

我有这段代码可以找到一级评论 block 但没有嵌套:

#<!--block:listing-->... html code block here ...<!--endblock-->
$blocks{$1} = $2 while $content =~ /<!--block:(.*?)-->((?:(?:(?!<!--(.*?)-->).)|(?R))*?)<!--endblock-->/igs;

这是我要处理的完整嵌套 html 模板。所以我需要找到并替换内部 block “block:third”并将其替换为我的内容,然后找到“block:second”并替换它然后找到外部 block “block:first”并替换它。请注意,可以有任意数量的嵌套 block ,而不仅仅是下面示例中的三个,它可以是多个嵌套 block 。

use Data::Dumper;

$content=<<HTML;
some html content here

<!--block:first-->
some html content here

<!--block:second-->
some html content here

<!--block:third-->
some html content here
<!--endblock-->

some html content here
<!--endblock-->

some html content here
<!--endblock-->
HTML

$blocks{$1} = $2 while $content =~ /<!--block:(.*?)-->((?:(?:(?!<!--(.*?)-->).)|(?R))*?)<!--endblock-->/igs;
print Dumper(%blocks);

所以我可以访问和修改像 $block{first} = "my content here"$block{second} = "another content here" 等 block 然后替换积木。

我创建了这个 regex

最佳答案

更新:

这是对“组合”成单个正则表达式的响应...

看来您并不关心重构 html 的顺序。
所以,如果您只想隔离每个子部分的内容,下面就是您所需要的。
但是,您将需要列表 ( [] ) 来重构嵌入子部分的顺序。

用这个问题刷新自己后,请注意下面使用的正则表达式是您应该使用的正则表达式。

use Data::Dumper;

$/ = undef;
my $content = <DATA>;


my $href = {};

ParseCore( $href, $content );

#print Dumper($href);

print "\nBase======================\n";
print $href->{content};
print "\nFirst======================\n";
print $href->{first}->{content};
print "\nSecond======================\n";
print $href->{first}->{second}->{content};
print "\nThird======================\n";
print $href->{first}->{second}->{third}->{content};
print "\nFourth======================\n";
print $href->{first}->{second}->{third}->{fourth}->{content};
print "\nFifth======================\n";
print $href->{first}->{second}->{third}->{fourth}->{fifth}->{content};

exit;

sub ParseCore
{
my ($aref, $core) = @_;
my ($k, $v);
while ( $core =~ /(?is)(<!--block:(.*?)-->((?:(?:(?!<!--block:(?:.*?)-->).)|(?R))*?)<!--endblock-->|((?:(?!<!--block:.*?-->).)+))/g )
{
if (defined $2) {
$k = $2; $v = $3;
$aref->{$k} = {};
# $aref->{$k}->{content} = $v;
# $aref->{$k}->{match} = $1;

my $curraref = $aref->{$k};
my $ret = ParseCore($aref->{$k}, $v);
if (defined $ret) {
$curraref->{'#next'} = $ret;
}
}
else
{
$aref->{content} .= $4;
}
}
return $k;
}

#================================================
__DATA__
some html content here top base
<!--block:first-->
<table border="1" style="color:red;">
<tr class="lines">
<td align="left" valign="<--valign-->">
<b>bold</b><a href="http://www.mewsoft.com">mewsoft</a>
<!--hello--> <--again--><!--world-->
some html content here 1 top
<!--block:second-->
some html content here 2 top
<!--block:third-->
some html content here 3 top
<!--block:fourth-->
some html content here 4 top
<!--block:fifth-->
some html content here 5a
some html content here 5b
<!--endblock-->
<!--endblock-->
some html content here 3a
some html content here 3b
<!--endblock-->
some html content here 2 bottom
<!--endblock-->
some html content here 1 bottom
<!--endblock-->
some html content here1-5 bottom base

some html content here 6-8 top base
<!--block:six-->
some html content here 6 top
<!--block:seven-->
some html content here 7 top
<!--block:eight-->
some html content here 8a
some html content here 8b
<!--endblock-->
some html content here 7 bottom
<!--endblock-->
some html content here 6 bottom
<!--endblock-->
some html content here 6-8 bottom base

输出>>

Base======================
some html content here top base

some html content here1-5 bottom base

some html content here 6-8 top base

some html content here 6-8 bottom base
First======================

<table border="1" style="color:red;">
<tr class="lines">
<td align="left" valign="<--valign-->">
<b>bold</b><a href="http://www.mewsoft.com">mewsoft</a>
<!--hello--> <--again--><!--world-->
some html content here 1 top

some html content here 1 bottom

Second======================

some html content here 2 top

some html content here 2 bottom

Third======================

some html content here 3 top

some html content here 3a
some html content here 3b

Fourth======================

some html content here 4 top


Fifth======================

some html content here 5a
some html content here 5b

您可以使用REGEX 递归来匹配外部嵌套,然后解析内部CORE
使用简单的递归函数调用。

然后它也可以在你所在的嵌套级别上解析内容。
也可以沿途创建嵌套结构,以便您以后使用
做模板替换。

然后您可以重建 html。
唯一棘手的部分是遍历数组。但是,如果你知道如何遍历
数组(标量、数组/散列引用等)应该没问题。

这是示例。

    # (?is)<!--block:(.*?)-->((?:(?:(?!<!--(?:.*?)-->).)|(?R))*?)<!--endblock-->|((?:(?!<!--.*?-->).)+)

(?is) # Modifiers: Case insensitive, Dot-all
<!--block: # Begin BLOCK
( .*? ) # (1), block name
-->

( # (2 start), Begin Core
(?:
(?:
(?!
<!--
(?: .*? )
-->
)
.
)
| (?R)
)*?
) # (2 end), End Core

<!--endblock--> # End BLOCK
|
( # (3 start), Or grab content within this core
(?:
(?! <!-- .*? --> )
.
)+
) # (3 end)

Perl 测试用例

use Data::Dumper;

$/ = undef;
my $content = <DATA>;


my %blocks = ();
$blocks{'base'} = [];


ParseCore( $blocks{'base'}, $content );


sub ParseCore
{
my ($aref, $core) = @_;
while ( $core =~ /(?is)<!--block:(.*?)-->((?:(?:(?!<!--(?:.*?)-->).)|(?R))*?)<!--endblock-->|((?:(?!<!--.*?-->).)+)/g )
{
if ( defined $1 )
{
my $branch = {};
push @{$aref}, $branch;
$branch->{$1} = [];
ParseCore( $branch->{$1}, $2 );
}
elsif ( defined $3 )
{
push @{$aref}, $3;
}
}

}

print Dumper(\%blocks);

__DATA__

some html content here top base
<!--block:first-->
some html content here 1 top
<!--block:second-->
some html content here 2 top
<!--block:third-->
some html content here 3a
some html content here 3b
<!--endblock-->
some html content here 2 bottom
<!--endblock-->
some html content here 1 bottom
<!--endblock-->
some html content here bottom base

输出>>

$VAR1 = {
'base' => [
'
some html content here top base
',
{
'first' => [
'
some html content here 1 top
',
{
'second' => [
'
some html content here 2 top
',
{
'third' => [
'
some html content here 3a
some html content here 3b
'
]
},
'
some html content here 2 bottom
'
]
},
'
some html content here 1 bottom
'
]
},
'
some html content here bottom base
'
]
};

关于regex - Perl 替换嵌套 block 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22386692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com