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
分解正则表达式
(?<=\[\[(section_\w{3})\]\])
提供后向匹配以 [[section_foo]]
开头的字符串,而不包括标签
(.+)
捕获标签内的所有内容
(?>\[\[\/\]\])
提供先行匹配以相同 [[/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>
例子:
如果没有段嵌套,试试
preg_match_all('~\[\[(\w+)]]((?>[^[]+|\[[^[])*)\[\[/]]~s', $str, $out)
\[\[(\w+)]]
captures one or more word characters[[
里面]]
在节标签之间使用 (?>[^[]+|\[[^[])*
而不是 .*?
以获得更好的性能,但仍然允许 a[b]c
。如果你有嵌套的东西,你可以很容易地 make this pattern recursive.
\[\[/]]
在第一个捕获组中以 what was captured 结束该部分。
花费了超过 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
分解正则表达式
(?<=\[\[(section_\w{3})\]\])
提供后向匹配以[[section_foo]]
开头的字符串,而不包括标签(.+)
捕获标签内的所有内容(?>\[\[\/\]\])
提供先行匹配以相同[[/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>
例子:
如果没有段嵌套,试试
preg_match_all('~\[\[(\w+)]]((?>[^[]+|\[[^[])*)\[\[/]]~s', $str, $out)
\[\[(\w+)]]
captures one or more word characters[[
里面]]
在节标签之间使用
(?>[^[]+|\[[^[])*
而不是.*?
以获得更好的性能,但仍然允许a[b]c
。如果你有嵌套的东西,你可以很容易地 make this pattern recursive.\[\[/]]
在第一个捕获组中以 what was captured 结束该部分。