php - 正则表达式 PHP 查找并匹配具有特定数据属性的 HTML 标记
问题描述
我正在尝试解析 CTP 文件(其中包含 HTML 和 PHP 标记的 CakePHP 模板)并希望将所有 HTML 标记与特定数据属性(data-edit="true")匹配。每个带有 data-edit="true" 的标签必须有一个 data-type="..." 和 data-name="..." 属性。我想在(命名的)组中捕获这些属性,所以我可以在我的代码中使用它们。到目前为止,我有以下正则表达式:
\<(?<tagname>\w+).*?(?>data\-edit="true").*?\>(?<content>.*?)\<\/(?&tagname)\>
以下是它应该匹配的一些标签示例:
<h4 data-type="text" data-edit="true" data-name="SomeName">Some content, with or without newlines.</h4>
和
<span data-edit="true" data-type="wysiwyg" data-name="Beoordeling">Some text
with <strong>tags</strong> and newlines in it that
should not break the parser.</span>
从上面的示例中,我希望正则表达式返回数据类型和数据名称标签的内容,当然还有内容(标签之间)本身。
数据属性可以以任何顺序出现,并且标签中可能存在其他属性(例如类)。到目前为止,我已经设法仅获取具有 data-edit="true" 属性的标签的内容,但是当有换行符时,匹配会中断。我也无法捕获其他数据属性。
甚至有可能我想要实现什么?我知道正则表达式不是解析 HTML 的首选方式,但由于这是一个包含各种其他标签的 CTP 文件,我不能使用 XML 解析器。
编辑:示例代码:https ://regex101.com/r/nF6a96/2
解决方案
您应该避免使用正则表达式解析 html,但由于这是在标签内查找属性的情况,而不是标签的某些嵌套场景,因此您可以在此处使用正则表达式进行快速验证。
您需要使用前瞻来确保标签确实包含您正在寻找的所有三种属性。你可以使用这个正则表达式,
<(\w+)(?=.*?data-edit="true")(?=.*?data-type="[^"]*")(?=.*?data-name="[^"]*")[^>]*?>.*?<\/\1>
解释:
<(\w+)
--> 匹配一个标签并捕获 group1 中的标签名以匹配结束标签的末尾(?=.*?data-edit="true")
--> 前瞻并确保存在数据编辑属性(?=.*?data-type="[^"]*")
--> 前瞻并确保存在数据类型属性(?=.*?data-name="[^"]*")
--> 前瞻并确保存在 data-name 属性[^>]*?>
--> 匹配输入和结束标签的其余部分.*?
--> 匹配开始和结束标签内的任何文本<\/\1>
--> 匹配结束标签
推荐阅读
- html - 带有表格布局的表格:在 Firefox 中固定 100% 高度
- c# - 在这种情况下如何使查找字段工作而不在数据库中定义外键?
- python - 如何使用python子进程输入管道
- flutter - Flutter:文本仅在点击按钮两次后更新
- amazon-web-services - AWS 中的 AMI 到底是什么?
- r - R中的内存问题“错误:无法分配大小为344 kb的向量”
- firebase - 为什么firebase在退出后会抛出权限错误?
- sql - 选择按日期分组的一系列数字?
- git - 来自整个 git 存储库历史的原始代码总行数
- python - Plotly:如何使用 plotly express 在单迹散点图中显示图例?