花了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);
答案 0 :(得分:2)
怎么样:
(\[\[[^\]]+\]\])([^\[]+)(\[\[[^\]]+\]\])
第1组将包含开放标签
第2组将包含数据块
第3组将包含结束标记
答案 1 :(得分:2)
如果没有部分嵌套,请尝试使用
preg_match_all('~\[\[(\w+)]]((?>[^[]+|\[[^[])*)\[\[/\1]]~s', $str, $out)
\[\[(\w+)]]
captures [[
]]
在使用(?>[^[]+|\[[^[])*
而不是.*?
的部分标记之间获得更好的效果但仍然允许a[b]c
。如果你有嵌套的东西,你可以轻松地make this pattern recursive。
\[\[/\1]]
在第一个捕获组中以what was captured结束该部分。
答案 2 :(得分:1)
这就是你要找的东西:
/(?<=\[\[(section_\w{3})\]\])(.+)(?>\[\[\/\1\]\])/s
(?<=\[\[(section_\w{3})\]\])
提供了lookbehind,用于匹配以[[section_foo]]
开头的字符串,而不包含标记(.+)
捕获标记内的所有内容(?>\[\[\/\1\]\])
提供与使用相同[[/section_foo]]
标记结尾的字符串匹配的预测,但不包含标记(注意:\1
是对第一个捕获的组的引用,即标记名)< / LI>
/s
使点.
与换行符匹配(请注意,在打开后和关闭标记之前的当前正则表达式换行符号中包含在匹配中)示例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>
示例强>: