Php 如何按选定的html标记分解字符串

Php 如何按选定的html标记分解字符串,php,dom,explode,Php,Dom,Explode,我需要按所选标记分解包含(无效)HTML的字符串-,,。若嵌套了任何标记,则字符串应仅由第一个标记分解 插入的输入: <div id="main"> <h1 id="heading">Heading h1</h1> <p> <ol> <li>abc</li> <li>def</li> <li>ghi</li> </o

我需要按所选标记分解包含(无效)HTML的字符串-
。若嵌套了任何标记,则字符串应仅由第一个标记分解

插入的输入:

  <div id="main">
  <h1 id="heading">Heading h1</h1>
  <p>
  <ol>
    <li>abc</li>
    <li>def</li>
    <li>ghi</li>
  </ol>
  Lorem ipusm lorem ipsum Lorem ipusm lorem ipsum Lorem ipusm lorem ipsum Lorem ipusm.
  </p>
  <p>Test test test test test</p>
  <ul>
    <li>aaa</li>
  </ul>
  </div>

品目h1

  • abc
  • def
  • ghi
  • Lorem ipusm Lorem ipsum Lorem ipusm Lorem ipsum Lorem ipusm Lorem ipsum Lorem ipsum Lorem ipusm。

    测试测试

    • aaa
    导出的输出:

    $output[0] = '<div id="wrapp"><h1 id="heading">Heading h1</h1>';
    $output[1] = '<p><ol><li>abc</li><li>def</li><li>ghi</li></ol>Lorem ipusm lorem ipsum Lorem ipusm lorem ipsum Lorem ipusm lorem ipsum Lorem ipusm.</p>';
    $output[2] = '<p>Test test test test test</p>';
    $output[3] = '<ul><li>aaa</li></ul></div>';
    
    $output[0]=“标题h1”;
    $output[1]='
  • abc
  • def
  • ghiLorem ipusm Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum.

    '; $output[2]='测试''; $output[3]='
    • aaa
    ';

    我尝试了一些DOM库,但没有人不能满足我的需要。最大的问题是分割div#main元素和嵌套标记(无效的html)。我很感激你的任何想法。

    你可以使用像
    这样的正则表达式,这有什么用?不管它是什么,都可以用DOMDocument完成。XY问题?由于翻译成不同的语言(整个想法有点复杂),我需要将长字符串分解成较短的片段。例如,我尝试了Ganon库,它的问题在

    部分。Ganon返回我->和->,这是错误的-它应该是->->。谢谢,我修复了一些错误,但基本上它是按我需要的方式工作的。我只是担心它的速度,当非常大的字符串进来。这是可运行的版本:$output=$match=array()$正则表达式/
    $html = "<div id="wrapp"><h1 id="heading">Heading ...";
    $output = $match = array();
    $regex = '<(p|h[1-6]|ul|ol|table)';
    while(preg_match($regex, $html, $match, PREG_OFFSET_CAPTURE)){
        $endTag = '</' . $match[1][0] '>';
        $endPosition = strpos($html, $endTag)
        $output[] = substr($html, 0 , $endPosition);
        $html = substr($html, $endPosition + strlen($endTag));
    }