Замена тегов внутри родительского тега с использованием DOM PHP - PullRequest
1 голос
/ 05 февраля 2011

Вот что я получил:

<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>

Мне нужно как-то заменить теги LI только внутри div id = "list" -> теги OL, которые мне нужны, чтобы он заменял только теги LI только в первом OLтеги, а не UL или когда-то внутри OL -> OL теги

Я пытался использовать preg_replace_callback, но он только заменяет все теги LI внутри id = "list", и, как я полагал, это будет слишком сложно для ограничения заменытолько с первыми тегами ol, а не с остальными, поэтому мне предложили попробовать PHP DOM, так как он должен быть таким же простым, как div id = "list" -> OL

Я был бы признателен, если бы кто-то начал меня скод, возможно, с чем-то, заменяющим все теги LI в первом теге OL во всем содержимом.

1 Ответ

3 голосов
/ 05 февраля 2011

Вы не должны делать это с регулярным выражением. Это очень плохой способ разобрать (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, которые в настоящее время не закрыты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...