PHP 正则表达式 - 捕获两个字符串之间的内容(多个结果)

PHP regex - capturing content between two strings (multiple results)

花费了超过 2.5 小时后,有人可以帮助解决以下问题吗?

我有 html 格式的文件:

示例 1

[[section_abc]]
<div>
several lines of html ...
</div>
[[/section_abc]]

示例 1

[[section_opq]]
<div>
several lines of html ...
</div>
[[/section_opq]]

以下是所需的输出: 示例 1: 第 1 组:section_abc group2:[[section_abc]][[/section_abc]]

之间的内容

示例 2: 第 1 组:section_opq group2:[[section_opq]][[/section_opq]]

之间的内容

这是我当前的测试线:

preg_match_all("/(\[\[)([^}]+)(\]\])/", $input_lines, $output_array);

怎么样:

(\[\[[^\]]+\]\])([^\[]+)(\[\[[^\]]+\]\])

第 1 组将包含开始标签
第 2 组将包含数据块
第 3 组将包含结束标记

这就是您要查找的内容:

/(?<=\[\[(section_\w{3})\]\])(.+)(?>\[\[\/\]\])/s

分解正则表达式

  1. (?<=\[\[(section_\w{3})\]\]) 提供后向匹配以 [[section_foo]] 开头的字符串,而不包括标签
  2. (.+) 捕获标签内的所有内容
  3. (?>\[\[\/\]\]) 提供先行匹配以相同 [[/section_foo]] 标记结尾的字符串,但不包含该标记(注意:</code> 是对第一个捕获组的引用,即标记名)</li> <li><code>/s 使点 . 匹配换行符(请注意,在当前正则表达式中,在开始和结束标记之前的换行符包含在匹配中)

结果

示例 1:

第 1 组:section_abc

第 2 组:

<div>
several lines of html ...
</div>

示例 2:

第 1 组:section_opq

第 2 组:

<div>
several lines of html ...
</div>

此模式可能有效(最小):

\[{2}([^\W]+)\]{2}\n([^[]+)

结果:

匹配 1

第 1 组:

section_abc

第 2 组:

<div>
several lines of html ...
<more><a href=""></a>
</div>`

匹配 2

第 1 组:

section_opq

第 2 组:

<div>
several lines of html ...
<more><a href=""></a>
</div>

例子:

https://regex101.com/r/lCX9FA/1

如果没有段嵌套,试试

preg_match_all('~\[\[(\w+)]]((?>[^[]+|\[[^[])*)\[\[/]]~s', $str, $out)

php demo at eval.in or regex demo at regex101