如何通过选定的html标签来分解字符串

时间:2014-07-06 14:49:33

标签: php dom explode

我需要通过选定的标签 - <p>, <ol>, <ul>, <table>, <h1-6>来爆炸包含(无效)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>

Exptected output:

$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>';

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

1 个答案:

答案 0 :(得分:1)

您可以将<(p|h[1-6]|ul|ol|table)这样的正则表达式与preg_match一起使用到find the position of your opening tag。然后使用返回的匹配来查找结束匹配。 您的代码看起来像这样

$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));
}

请注意,此代码未经测试。