【发布时间】:2019-04-12 23:20:09
【问题描述】:
我正在尝试解析 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
【问题讨论】:
-
"因为这是一个包含各种其他标签的 CTP 文件,所以我不能使用 XML 解析器" ... XML 解析器绝对可以对于您给出的两个示例,它可能会失败的地方是 HTML 标记没有以 XML 方式关闭(例如
<br>)(尽管DOMDocument可以应付)或者嵌入了 PHP @987654327 @)。 -
@mickmackusa:更新了问题,包含了示例代码的链接