这是我得到的:
<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标记。
答案 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();
另请注意,您需要修复目前未公开的ol
和ul
结束标记。