- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要获取哈希数组或哈希树中的嵌套 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/
我正在用 yacc/bison 编写一个简单的计算器。 表达式的语法看起来有点像这样: expr : NUM | expr '+' expr { $$ = $1 + $3; } | expr '-'
我开始学习 lambda 表达式,并在以下情况下遇到了以下语句: interface MyNumber { double getValue(); } MyNumber number; nu
这两个 Linq 查询有什么区别: var result = ResultLists().Where( c=> c.code == "abc").FirstOrDefault(); // vs. va
如果我们查看 draft C++ standard 5.1.2 Lambda 表达式 段 2 说(强调我的 future ): The evaluation of a lambda-expressio
我使用的是 Mule 4.2.2 运行时、studio 7.5.1 和 Oracle JDK 1.8.0_251。 我在 java 代码中使用 Lambda 表达式,该表达式由 java Invoke
我是 XPath 的新手。我有网页的html源 http://london.craigslist.co.uk/com/1233708939.html 现在我想从上面的页面中提取以下数据 完整日期 电子
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我将如何编写一个 Cron 表达式以在每天上午 8 点和下午 3:30 触发?我了解如何创建每天触发一次的表达式,而不是在多个设定时间触发。提前致谢 最佳答案 你应该只使用两行。 0 8 * * *
这个问题已经有答案了: What do 3 dots next to a parameter type mean in Java? (9 个回答) varargs and the '...' argu
我是 python 新手,在阅读 BeautifulSoup 教程时,我不明白这个表达式“[x for x in titles if x.findChildren()][:-1]”我不明白?你能解释一
(?:) 这是一个有效的 ruby 正则表达式,谁能告诉我它是什么意思? 谢谢 最佳答案 正如其他人所说,它被用作正则表达式的非捕获语法,但是,它也是正则表达式之外的有效 ruby 语法。 在
这个问题在这里已经有了答案: Why does ++[[]][+[]]+[+[]] return the string "10"? (10 个答案) 关闭 8 年前。 谁能帮我处理这个 JavaSc
这个问题在这里已经有了答案: What is the "-->" operator in C++? (29 个答案) Java: Prefix/postfix of increment/decrem
这个问题在这里已经有了答案: List comprehension vs. lambda + filter (16 个答案) 关闭 10 个月前。 我不确定我是否需要 lambda 或其他东西。但是,
C 中的 assert() 函数工作原理对我来说就像一片黑暗的森林。根据这里的答案https://stackoverflow.com/a/1571360 ,您可以使用以下构造将自定义消息输出到您的断言
在this页,John Barnes 写道: If the conditional expression is the argument of a type conversion then effec
我必须创建一个调度程序,它必须每周从第一天上午 9 点到第二天晚上 11 点 59 分运行 2 天(星期四和星期五)。为此,我需要提供一个 cron 表达式。 0-0 0-0 9-23 ? * THU
我正在尝试编写一个 Linq 表达式来检查派生类中的属性,但该列表由来自基类的成员组成。下面的示例代码。以“var list”开头的 Process 方法的第二行无法编译,但我不确定应该使用什么语法来
此 sed 表达式将输入字符串转换为两行输出字符串。两条输出行中的每一行都由输入的子串组成。第一行需要转换成大写: s:random_stuff\(choice1\|choice2\){\([^}]*
我正在使用 Quartz.Net 在我的应用程序中安排我的工作。我只是想知道是否可以为以下场景构建 CRON 表达式: Every second between 2:15AM and 5:20AM 最
我是一名优秀的程序员,十分优秀!