php - 如何使用正则表达式仅解析第一级嵌套标签?

标签 php regex

假设我有这样一段文字:

<item>
   foo bar foo bar 
   <item> child item </item>
</item>
<item>
   second item
   <item> second child </item>
</item>

在这里,我想要的是只解析 <item> 的两个顶层。 s 被解析,结果以这样的数组形式返回给我:

[0] = "foo bar foo bar  <item>child item</item>"
[1] = "second item  <item>second child </item>";

但是在我的测试中,自子级别<item>标签与模式匹配,它们也包含在内,我得到一个 4 元素数组而不是我想要的 2 元素数组。

这是我用过的模式:

%<item>(.+)</item>%si

有什么想法吗?

编辑:这不是针对 HTML,而是针对我不能使用任何 dom 解析器的自定义内部脚本语言。因此,请提出一个正则表达式解决方案。

最佳答案

%<p>(.+?)^</p>%smi

编辑

$text = "<item> foo bar foo bar <item> child item </item> </item> <item> second item <item> second child </item> </item>";
preg_match_all('%<item>(.*?<item>.*?</item>).*?</item>%si', $text, $matches);
print_r($matches[1]);

输出

Array
(
    [0] =>  foo bar foo bar <item> child item </item>
    [1] =>  second item <item> second child </item>
)

关于php - 如何使用正则表达式仅解析第一级嵌套标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13423900/

相关文章:

java - 从 Java 向 PHP 发送数据的最佳方式是什么?

php - 如何使用pecl solr扩展连接到mysql?

php - PHP 中的通用数据库连接

php preg_match 只匹配数字、字母和点

html - PHP回显一个弹出窗口

php - 在 php 中回显 jquery 警报弹出窗口

regex - 仅使用一些参数在 Matlab 中创建字符串

c# - 正则表达式: Getting everything except certain matching strings

c# - 在特定字符 c# 之前插入字符

php - PHP 中的字符串替换