用PHP用div包装HTML片段(并从HTML标记生成目录)

用PHP用div包装HTML片段(并从HTML标记生成目录),php,regex,dom,Php,Regex,Dom,我的原始HTML如下所示: <h1>Page Title</h1> <h2>Title of segment one</h2> <img src="img.jpg" alt="An image of segment one" /> <p>Paragraph one of segment one</p> <h2>Title of segment two</h2> <p>Her

我的原始HTML如下所示:

<h1>Page Title</h1>

<h2>Title of segment one</h2>
<img src="img.jpg" alt="An image of segment one" />
<p>Paragraph one of segment one</p>

<h2>Title of segment two</h2>
<p>Here is a list of blabla of segment two</p>
<ul>
  <li>List item of segment two</li>
  <li>Second list item of segment two</li>
</ul>
页面标题
第一部分的标题
第一部分第一段

第二部分的标题 下面是第二段的blabla列表

  • 第二部分的项目清单
  • 第二段的第二个清单项目
现在,使用PHP(而不是jQuery),我想修改它,如下所示:

<h1>Page Title</h1>

<div class="pane">
  <h2>Title of segment one</h2>
  <img src="img.jpg" alt="An image of segment one" />
  <p>Paragraph one of segment one</p>
</div>

<div class="pane">
   <h2>Title of segment two</h2>
   <p>Here is a list of blabla of segment two</p>
   <ul>
     <li>List item of segment two</li>
     <li>Second list item of segment two</li>
   </ul>
</div>
<ul class="tabs">
  <li><a href="#">Title of segment one</a></li>
  <li><a href="#">Title of segment two</a></li>
</ul>
页面标题
第一部分的标题
第一部分第一段

第二部分的标题 下面是第二段的blabla列表

  • 第二部分的项目清单
  • 第二段的第二个清单项目
因此,基本上,我希望用
标记集之间包装所有HTML。上面的HTML已经允许我创建一个与jQuery兼容的HTML,这很好,但我想进一步:

我希望创建受影响的所有
集合的ul,如下所示:

<h1>Page Title</h1>

<div class="pane">
  <h2>Title of segment one</h2>
  <img src="img.jpg" alt="An image of segment one" />
  <p>Paragraph one of segment one</p>
</div>

<div class="pane">
   <h2>Title of segment two</h2>
   <p>Here is a list of blabla of segment two</p>
   <ul>
     <li>List item of segment two</li>
     <li>Second list item of segment two</li>
   </ul>
</div>
<ul class="tabs">
  <li><a href="#">Title of segment one</a></li>
  <li><a href="#">Title of segment two</a></li>
</ul>
请注意,我正在使用jQuery工具选项卡来实现这个系统的JavaScript部分,并且它不要求.tabs的HREF指向它们特定的h2对应项

我的第一个猜测是使用正则表达式,但我也看到一些人在谈论正则表达式

jQuery中存在两种解决此问题的方法,但我确实需要一种与PHP等效的方法:


有人能帮我吗?

使用PHP函数执行此任务。

DOMDocument可以帮助您完成此任务。我以前也回答过类似的问题:

更新

完整的代码示例包括:

$d = new DOMDocument;
libxml_use_internal_errors(true);
$d->loadHTML($html);
libxml_clear_errors();

$segments = array(); $pane = null;

foreach ($d->getElementsByTagName('h2') as $h2) {
    // first collect all nodes
    $pane_nodes = array($h2);
    // iterate until another h2 or no more siblings
    for ($next = $h2->nextSibling; $next && $next->nodeName != 'h2'; $next = $next->nextSibling) {
        $pane_nodes[] = $next;
    }

    // create the wrapper node
    $pane = $d->createElement('div');
    $pane->setAttribute('class', 'pane');

    // replace the h2 with the new pane
    $h2->parentNode->replaceChild($pane, $h2);
    // and move all nodes into the newly created pane
    foreach ($pane_nodes as $node) {
        $pane->appendChild($node);
    }
    // keep title of the original h2
    $segments[] = $h2->nodeValue;
}

//  make sure we have segments (pane is the last inserted pane in the dom)
if ($segments && $pane) {
    $ul = $d->createElement('ul');
    foreach ($segments as $title) {
        $li = $d->createElement('li');

        $a = $d->createElement('a', $title);
        $a->setAttribute('href', '#');

        $li->appendChild($a);
        $ul->appendChild($li);
    }

    // add as sibling of last pane added
    $pane->parentNode->appendChild($ul);
}

echo $d->saveHTML();

…您需要一个好的PHP html解析器。 一个是好的。
这是一个相当于jquery的PHP。

谢谢,DOMDocument似乎是一个不错的选择。你能详细说明一下如何瞄准这段时间内发生的一切,以及如何处理最后一次发生的事情吗?@maartenmachiels当然,给我几个小时:)@maartenmachiels的答案更新了,看看:)当然,我没花几个小时就做到了!我会尽快测试代码,很快就会回来批准你的答案……你真是个天才。非常感谢你!你的代码运行得很好。一些详细问题:由于某种原因,
ul.tabs的
href
s未使用
li
s包装。另外,您能告诉我如何防止使用
包装输出吗?