使用DOM PHP替换父标记内的标记

时间:2011-02-04 23:06:55

标签: php xml dom

这是我得到的:

<div id="list">
<ol>
  <li>Ordered list 1</li>
  <li>Ordered list 2</li>
  <ul><li>Unordered list inside ol ul</li></ul>
  <ol><li>Ordered list inside ol ol</li></ol>
</ol>

<ul>
  <li>Unordered list</li>
  <ol><li>Ordered list inside ul</li></ol>
</ul>

<ol>
  <li>Ordered list 1</li>
  <ol><li>Ordered list inside ol ol</li></ol>
</ol>
</div>

我只需要在div id =“list” - &gt;里面以某种方式替换LI标签OL标签 我需要这样它只在第一个OL标签内替换LI标签,而不是UL或一次内部OL - &gt; OL标签

我尝试使用preg_replace_callback,但它只替换id =“list”中的所有LI标签,并且从我认为它将超出我的头部来限制只用第一个ol标签替换,而不是其余的,所以我被建议尝试PHP DOM,因为它应该像div id =“list”一样简单 - &gt; OL

如果有人让我开始使用代码,我会很感激,可能会在整个内容的第一个OL标记中替换所有LI标记。

1 个答案:

答案 0 :(得分:3)

你不应该用正则表达式来做这件事。解析(HT | X)ML是一种非常糟糕的方法。请改用正版解析器。以下是使用PHP DOMDocument类和相关DOMXPath

的示例
<?php

$doc = new DomDocument(); 
$doc->loadXML('your HTML');
$xpath = new DOMXPath($doc);  

// get li elements in the first ol in the div whose id is list
$nodes = $xpath->query('//div[@id="list"]/ol[1]/li');

// change li elements to <li class='list'><div class='inline'>#####</div></li>
foreach ($nodes as $node) {
    $node->setAttribute('class', 'list');
    $number = $node->firstChild;
    $div = $doc->createElement('div');
    $div->setAttribute('class', 'inline');
    $div->appendChild($number);
    $node->appendChild($div);
}

// get the new HTML
$html = $doc->saveHTML();

另请注意,您需要修复目前未公开的olul结束标记。