Php preg_match_all-正则表达式的贪婪部分,但最大化匹配数

Php preg_match_all-正则表达式的贪婪部分,但最大化匹配数,php,regex,preg-match-all,regex-greedy,Php,Regex,Preg Match All,Regex Greedy,我需要解析以下html: <h1 class="x">test</h1> <p>some text <img src="x" /></p> <h1 class="x1">test2</h1> <p>some text </p> <h1 class="2">test3</h1> <p>some text <img src="x" /><

我需要解析以下html:

<h1 class="x">test</h1>
<p>some text <img src="x" /></p>

<h1 class="x1">test2</h1>
<p>some text </p>

<h1 class="2">test3</h1>
<p>some text <img src="x" /></p>
测试
一些文本

测试2 一些文本

测试3 一些文本

我可以用一个正则表达式将其解析为一个数组吗

我试过了

preg_match_all('#(<h1[^>]*?>)(.*?)(</h1>)(.*)#ism',$html,$arr);
preg#u match_all('#(]*?>)(.*)(.*)#ism',$html,$arr);
这只给了我一个条目,因为正则表达式的最后一部分是贪婪的

preg_match_all('#(<h1[^>]*?>)(.*?)(</h1>)(.*?)#ism',$html,$arr);
preg#u match_all('.#(]*?>)(.*)(.*)(.*)#ism',$html,$arr);
这没有给我任何关于
之间HTML的信息,因为表达式不是贪婪的

如何在匹配尽可能多的事件的同时,使匹配后的零件变得贪婪

补充意见:

  • 这个问题相当学术化,我已经使用pre_split和其他各种方法解决了这个问题,但也可能有缺点(例如DOM可能无法处理我无法控制的无效HTML)。然而,这是一个反复出现的问题,我有兴趣了解更多

    • 你需要某种形式的终端制造商。正则表达式无法猜测要匹配的部分

      在这种情况下,可能是在结尾处的
      (.*)
      之后出现一个前瞻性断言:

      (?=<h1|</body>|\z)#ims
      

      (?=您需要某种形式的终端生成器。正则表达式无法猜测您要匹配的部分

      在这种情况下,可能是在结尾处的
      (.*)
      之后出现一个前瞻性断言:

      (?=<h1|</body>|\z)#ims
      

      (?=忽略关于regex如何不合适的注释,因为这仍然是一个有趣的问题,有两种方法可以解决这个问题:贪婪和懒惰

      模式的各个部分是:


      • Lazy
        *?(?=忽略关于regex如何不合适的注释,因为这仍然是一个有趣的问题,有两种方法可以解决这个问题:贪婪和懒惰

        模式的各个部分是:


        • 懒惰
          *?(?=为什么不直接使用?感谢您的快速回答。足够公平。preg_match_中正则表达式的贪婪性可以得到管理,以便找到最多的匹配项?为什么不直接使用?感谢您的快速回答。足够公平。preg_match_中正则表达式的贪婪性可以得到管理,从而找到最多的匹配项吗?太棒了,准确这正是我想要的你想要的=