匹配嵌套的html注释块正则表达式[重复]

2024-04-25

我有这个 html 代码块:

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

我得到了这个正则表达式来匹配嵌套块:

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

这个工作正常,但如果任何块内容中有注释,就会中断。

这将会失败,因为<!--comment-->仅在第一场比赛中,但其余比赛都可以正常进行:

<!--block:first-->
    some html content here 1 top
    this <!--comment--> will make it fail here.
    <!--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

这是对此的后续question https://stackoverflow.com/questions/22386692/perl-replace-nested-blocks-regular-expression.

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
    this <!--comment--> will make it fail here.
    <!--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

我知道你一定听腻了:但你做错了。

我喜欢正则表达式,但它们并不是为此类问题而设计的。使用标准模板系统(如Template::Toolkit https://metacpan.org/pod/distribution/Template-Toolkit/lib/Template/Toolkit.pod.

如果您坚持这种方法,那么我建议您使用更简单的工具。不要尝试让正则表达式强制执行所有规则,而是尽可能使用最基本的正则表达式。在这种情况下,我建议您使用以下方法对文本进行标记split:

use strict;
use warnings;

my $content = do {local $/; <DATA>};

my @tokens = split /(<!--(?:block:.*?|endblock)-->)/, $content;

use Data::Dump;
dd \@tokens;

__DATA__

some html content here top base
<!--block:first-->
    some html content here 1 top
    this <!--comment--> will make it fail here.
    <!--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

Outputs:

[
  "\nsome html content here top base\n",
  "<!--block:first-->",
  "\n    some html content here 1 top\n    this <!--comment--> will make it fail here.\n    ",
  "<!--block:second-->",
  "\n        some html content here 2 top\n        ",
  "<!--block:third-->",
  "\n            some html content here 3a\n            some html content here 3b\n        ",
  "<!--endblock-->",
  "\n        some html content here 2 bottom\n    ",
  "<!--endblock-->",
  "\n    some html content here 1 bottom\n",
  "<!--endblock-->",
  "\nsome html content here bottom base",
]

正如您所看到的,该数组包含文本和匹配模式之一之间的交替。

现在,我不知道你的最终目标是什么,也不知道你最终想要什么格式的数据,所以我不能从这里提出任何建议。但是,如果原始数据结构确实满足您的需求,您可以很容易地重新创建它。更好的是,您实际上可以执行错误检查,以查找不匹配打开或关闭的块,而您的原始正则表达式会对您隐藏这些块。

Addendum

我已经在以下位置提供了这种方法的扩展完整解决方案:Perl replace nested blocks regular expression https://stackoverflow.com/a/24101864/1733163

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

匹配嵌套的html注释块正则表达式[重复] 的相关文章

  • 在 re.sub 中使用变量,以便 Python 解析多个日期时间格式字符串?

    我试图想出一个函数来将各种人类日期 时间格式字符串转换为Python兼容的字符串 来自 yyyy MMM dd to Y b d 到目前为止 我构建了下面的翻译字典 元组列表 yyyy Y MMM b 这样我可以将输入格式字符串中的占位符字
  • PHP:正则表达式删除`a`或`–?

    我使用这个正则表达式从字符串输入中删除所有标点符号 pg url preg replace W pg url 但有些符号或特殊字符我无法删除它们 例如 当我将其传递到我的数据库注入时 它会变成 or 我怎样才能摆脱这些奇怪的东西 Thank
  • 如何从捆绑 .spec.js 文件中排除 webpack

    我的 Package bundle 读取 var reqContext require context true js reqContext keys map reqContext 其中基本上包括所有 js 文件 我希望表达式排除任何 sp
  • 使用 powershell 和 regexp 替换整行文本?

    我有编程背景 但对 powershell 脚本和正则表达式还相当陌生 正则表达式一直困扰着我 我之前的项目也从未 强迫 我学习它 考虑到这一点 我有一个文件 其中有一行文本需要替换 我不能依赖于知道该行存在于哪里 它前面是否有空格 或者被替
  • 我可以将 RegExp 和 Function 存储在 JSON 中吗?

    给定一个像这样的块 var foo regexp http fun function 将其存储在 JSON 中的正确方法是什么 您必须将 RegExp 作为字符串存储在 JSON 对象中 然后您可以从字符串构造一个 RegExp 对象 JS
  • python 正则表达式中括号的奇怪行为

    我正在编写一个 python 正则表达式 它可以在文本文档中查找引用的字符串 从黑匣子中记录的航空公司飞行员的引用 我首先尝试编写具有以下规则的正则表达式 返回引号之间的内容 如果以 single 打开 则仅在以 single 关闭时返回
  • 正则表达式删除2个字符串之间的所有内容

    我的replaceAll 需要一个正则表达式来删除2 个字符串和字符串本身之间的所有内容 例如 如果我有类似的东西 stackoverflow is really awesome nremove123 n I love it 我试图做一个像
  • 在用户提交的正则表达式中查找捕获组

    我有一个 python 应用程序 需要处理用户提交的正则表达式 出于性能考虑 我想禁止捕获组和反向引用 我的想法是使用另一个正则表达式来验证用户提交的正则表达式不包含任何命名或未命名的组捕获 如下所示 def validate user r
  • javascript RegExp 的奇怪行为:相同的正则表达式产生不同的结果[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 Javascript 中带有全局标志的 RegExp 会给出错误的结果 https stackoverflow com questions 1520800 why regexp with gl
  • Google 文档上的正则表达式回车查找和替换

    On 谷歌文档 我想要每一个list item 我的项目符号是一个破折号 其中 20 个左右的文档中有 1 000 多个内容 需要通过额外的换行符分隔 这样可以更轻松地在移动设备上阅读 如何搜索分隔项目符号的换行符 并将其替换为两个换行符
  • 查找“”之间的字符串的正则表达式是什么

    我有一个字符串如下 http 172 1 10 1 3 http 192 168 15 2 6 http 192 168 1 100 1 2 8 内的字符串是一个标签 内的字符串是前面标签的值 返回我的正则表达式是什么 标签 http 17
  • 我应该如何使用 Perl URI 类?

    我需要在 Perl 程序中处理一些 HTTP URL 但我怀疑应该如何处理URI https metacpan org module URI类帮助我 特别是 我想使用URI用于解析相对 URL 并获取其组件的类 然而 问题是 我需要一个可以
  • 不区分大小写的关键字匹配

    我正在编写一种用于解析计算机语言的语法 可以与解析 Eyapp http search cpan org casiano Parse Eyapp 1 182 lib Parse Eyapp pod 这是一个 Perl 包 可以简化常规语言解
  • 当与不需要虚拟机的编译程序一起使用时,CGI 是否仍然很慢?

    当我学习 CGI 时 我了解到任何编程语言都可以用来将其输出挂钩到 http 响应消息 而它的输入是 http 请求消息 我读过的很多文章都在 Perl 的背景下讨论 CGI 这是因为 Perl 是与 CGI 结合使用的最常见的语言吗 我想
  • Perl:通过一次 MySQL 调用更新多行

    似乎这不可能 但嘿我不妨问一下 我可能是错的 想知道 perl 是否可以使用一个 MySQL 调用来更新多行 我正在使用 DBI 任何帮助或反馈将不胜感激 这可以通过 ASP 和 ASP net 在 MSSQL 中实现 所以想知道是否也可以
  • For 循环和词法作用域变量

    版本 1 use warnings use strict my count 4 for count 1 8 print Count count n last if count 6 if not defined count print Cou
  • 使用 XML::LibXML 删除 XML 命名空间

    我正在将 XML 文档转换为 HTML 需要做的事情之一是删除命名空间 命名空间不能在 HTML 中合法声明 除非它是根标记中的 XHTML 命名空间 我发现过 5 到 10 年前的帖子 介绍使用 XML LibXML 和 LibXML2
  • 使用正则表达式惰性(不贪婪)匹配多个组

    我想获取成对之间任何值的内容
  • 如何使用 diff 排除多行模式?

    我想对两个 xml 文件进行比较 但忽略 2 3 行模式 例如 假设我想在比较下面的 xml 格式时忽略可用性和价格 这是我到目前为止所拥有的 diff I
  • STDOUT->autoflush(1) 在 Perl 中做什么?

    我找到了有关 Perl 中自动刷新的各种信息 但找不到任何提及格式完全相同的行 STDOUT gt autoflush 1 这包含在我正在分析的程序中 我想更好地了解它的作用 程序开头还有这样一段话 use IO Handle 我认为这可能

随机推荐

  • 使用 PHP json_encode() 和 MySQL 返回 JSON 对象以传递给 jQuery 函数 [重复]

    这个问题在这里已经有答案了 我正在尝试从 MySQL 结果创建一个 json 对象 但没有得到我需要的结果 这是 PHP json array result mysqli query connection query echo while
  • CPU缓存性能。存储未命中与加载未命中

    我使用 perf 作为基本事件计数器 我正在开发一个遭受数据缓存存储未命中的程序 其中比例高达80 我知道缓存原则上是如何工作的 它会在各种未命中情况下从内存加载 并在需要时从缓存中删除数据 我不明白的是 存储未命中和加载未命中之间有什么区
  • 尝试使用 std::add_const 将 T& 转换为 const T&

    我有一个 T 它有一个函数的常量和非常量版本 我想调用该函数的 const 版本 我尝试使用 std add const 将 T 转换为 const T 但它不起作用 我做错了什么以及如何解决它 这是一个简单的例子 void f int s
  • Windows Phone 应用程序栏的图标颜色

    应用栏图标的颜色到底什么时候改变 即从白色变为黑色 或从黑色变为白色 当主题从黑色切换为白色时 或者当应用程序栏的背景画笔改变时 如果我想应用自己的自定义主题 以便应用程序栏始终为白色 该怎么办 我使用黑色图标 但即使应用程序栏是白色的 因
  • 编写跨环境传输的 URL 的安全方法

    我目前正在本地计算机上开发一些软件 为了这个问题 我们来调用一下这个软件StackOverflow 我有以下页面 C sites StackOverflow index php C sites StackOverflow content p
  • Javascript - 如何创建按键事件?

    我在互联网上查找过这一点 我所能找到的都是已弃用的函数 在发布之前请检查以确保您建议的代码没有被弃用 我发现了这个并尝试过 https developer mozilla org en US docs Web API KeyboardEve
  • Python Flask 应用程序在本地运行,但在 Heroku 上托管时返回 AttributeError

    我正在开发大学申请 该 Web 应用程序使用 joblib 加载给定模型 并且为了工作 它使用了 FlexibleScaler 类 灵活 py from sklearn preprocessing import MinMaxScaler S
  • 将自定义文件夹添加到 bazel java 测试中的类路径

    我正在尝试将大型代码库从 Maven 迁移到 bazel 我发现一些测试写入target classes and target test classes并且生产代码将其读取为类路径上的资源 这是因为 maven Surefire fails
  • E2E:使用 Wix Detox 从 UIImagePickerController 选择图像

    Description 我需要编写一个 e2e 测试 在某些时候它必须在 UIImagePickerController 中选择一个图像 我尝试使用element by type UIImagePickerController tapAtP
  • 如何使用python opencv2减去两个图像以获得前景对象

    有没有办法在 python opencv2 中减去两个图像 图片 1 任何图像 例如房屋图像 静态图像 图 2 带有物体的同一图像 在房子里 一个人站着 静态图像 动态物体 图片 3 图片 2 图片 1 如果我们减去Image2 from
  • Azure 中的 EUAP 区域是什么?

    Azure 中的某些区域被称为 EUAP 区域 但是我无法找到任何关于这意味着什么的定义 EUAP 代表什么 https learn microsoft com en us dotnet api microsoft azure docume
  • 如何使用 Objective-C 用空格分隔字符串?

    假设我有一个像这样的字符串 hello world this may have lots of sp ace or little space 我想将此字符串与此分开 hello world this may have lots of sp
  • MySQL 更新时会覆盖相同值的列吗?

    在MySQL中更新表时 例如 Table user user id user name 1 John 2 Joseph 3 Juan 如果我运行查询 UPDATE user SET user name John WHERE user id
  • 单击之前搜索查看查询提示

    我有一个搜索视图和一个查询提示属性 但是 只有在单击搜索视图后才会出现提示 有没有办法让它在点击之前出现
  • SonarQube 6.7 登录时冻结

    我刚刚在带有 MySQL 5 7 的 Ubuntu 16 04 服务器上安装了 SonarQube 6 7 我的同事使用 SonarQube 他们从托管在 GitHub 存储库上的源代码添加了他们的项目 添加了 3 4 个项目后 我们在 M
  • 使用mongoose在mongodb模式中使用ensureIndex

    我想打电话ensureIndex on the authorName 命令是什么以及我应该将其放在这段代码中的什么位置 var mongoose require mongoose defines the database schema fo
  • seo - 图像和 h1

    我遇到一种情况 我想坚持使用我的徽标而不是 h1 标签的实际文本 如果我将关键字放在 alt 标签中 而不是实际编写 我会在 SEO 上受到影响吗 文本和图像同时存在更好吗 想法 div h1 a href img src logo jpg
  • Spark 编码器:何时使用 beans()

    我在使用Spark的缓存机制时遇到了内存管理问题 我目前正在使用Encoder我正在使用 Kryo 想知道切换到 beans 是否可以帮助我减少缓存数据集的大小 基本上 在使用时使用 beans 相对于 Kryo 序列化有哪些优点和缺点En
  • 已将数据预先填充到资产中的领域?

    通常我使用 Realm 作为 RealmConfiguration config new RealmConfiguration Builder applicationContext deleteRealmIfMigrationNeeded
  • 匹配嵌套的html注释块正则表达式[重复]

    这个问题在这里已经有答案了 我有这个 html 代码块 some html content here top base some html content here 1 top some html content here 2 top so