首页 > 解决方案 > 正则表达式 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

标签: phpregex

解决方案


您应该避免使用正则表达式解析 html,但由于这是在标签内查找属性的情况,而不是标签的某些嵌套场景,因此您可以在此处使用正则表达式进行快速验证。

您需要使用前瞻来确保标签确实包含您正在寻找的所有三种属性。你可以使用这个正则表达式,

<(\w+)(?=.*?data-edit="true")(?=.*?data-type="[^"]*")(?=.*?data-name="[^"]*")[^>]*?>.*?<\/\1>

解释:

  • <(\w+)--> 匹配一个标签并捕获 group1 中的标签名以匹配结束标签的末尾
  • (?=.*?data-edit="true")--> 前瞻并确保存在数据编辑属性
  • (?=.*?data-type="[^"]*")--> 前瞻并确保存在数据类型属性
  • (?=.*?data-name="[^"]*")--> 前瞻并确保存在 data-name 属性
  • [^>]*?>--> 匹配输入和结束标签的其余部分
  • .*?--> 匹配开始和结束标签内的任何文本
  • <\/\1>--> 匹配结束标签

演示


推荐阅读