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

时间:2016-12-26 10:54:04

标签: php regex preg-match-all

花了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: group1:section_abc group2:[[section_abc]][[/section_abc]]之间的内容

示例2: group1:section_opq group2:[[section_opq]][[/section_opq]]之间的内容

这是我目前的测试线:

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

4 个答案:

答案 0 :(得分:2)

怎么样:

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

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

答案 1 :(得分:2)

如果没有部分嵌套,请尝试使用

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

请参阅php demo at eval.inregex demo at regex101

答案 2 :(得分:1)

这就是你要找的东西:

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

打破正则表达式

  1. (?<=\[\[(section_\w{3})\]\])提供了lookbehind,用于匹配以[[section_foo]]开头的字符串,而不包含标记
  2. (.+)捕获标记内的所有内容
  3. (?>\[\[\/\1\]\])提供与使用相同[[/section_foo]]标记结尾的字符串匹配的预测,但不包含标记(注意:\1是对第一个捕获的组的引用,即标记名)< / LI>
  4. /s使点.与换行符匹配(请注意,在打开后和关闭标记之前的当前正则表达式换行符号中包含在匹配中)
  5. 结果

    示例1:

    第1组:section_abc

    第2组:

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

    示例2:

    第1组:section_opq

    第2组:

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

答案 3 :(得分:1)

这种模式可能会起作用(最小):

\[{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