【问题标题】:modifying html list with PHP and SimpleDOM or SimpleXML使用 PHP 和 SimpleDOM 或 SimpleXML 修改 html 列表
【发布时间】:2011-03-03 18:01:43
【问题描述】:

我有一个具有这种结构的 HTML 片段:

<li class="level1 item3 parent">
    <a href="mainlink.html" class="level1 item3 parent">
        <span>
            <span class="title">Main title</span>
            <span class="sub">Subtitle</span>
        </span>
    </a>
    <ul class="level2">
        <li class="level2 item1 first">
            <a href="alink.html" class="level2 item1 first"><span>Title 1</span></a>
        </li>
        <li class="level2 item2">
            <a href="alink.html" class="level2 item2"><span>Title 2</span></a>
        </li>
        <li class="level2 item3">
            <a href="alink.html" class="level2 item3"><span>Title 3</span></a>
        </li>
        <li class="level2 item4 last">
            <a href="alink.html" class="level2 item4 last"><span>Title 4</span></a>
        </li>
    </ul>
</li>

我想改成这样:

<li class="level1 item3 parent">
    <a href="mainlink.html" class="level1 item3 parent">
        <span>
            <span class="title">Main title</span>
            <span class="sub">Subtitle</span>
        </span>
    </a>
    <ul class="level2">
        <li class="level2 item1 first">
            <a href="mainlink.html" class="level2 item1 first"><span>Main title</span></a>
        </li>
        <li class="level2 item1">
            <a href="alink.html" class="level2 item2"><span>Title 1</span></a>
        </li>
        <li class="level2 item2">
            <a href="alink.html" class="level2 item3"><span>Title 2</span></a>
        </li>
        <li class="level2 item3">
            <a href="alink.html" class="level2 item4"><span>Title 3</span></a>
        </li>
        <li class="level2 item4 last">
            <a href="alink.html" class="level2 item5 last"><span>Title 4</span></a>
        </li>
    </ul>
</li>

主要思想是在主li元素内的ul开头添加一个新项目,克隆部分a标签标题该li元素。我不知道如何使用 SimpleXML 或 SimpleDOM http://code.google.com/p/simpledom/ 来完成这项任务......有什么想法吗?

问候,

【问题讨论】:

  • Dom 很简单,PHP 已经有了 DOM lib PHP DOM 为什么还要导入另一个?

标签: php html-parsing simplexml simpledom


【解决方案1】:

新版本:

$doc = new DomDocument;
$doc->loadHTML($html);

$li = $doc->getElementsByTagName('li')->item(0)->cloneNode(true);

foreach($li->getElementsByTagName('ul') as $ul) {
    $ul->parentNode->removeChild($ul);
}

$span = $li->getElementsByTagName('span')->item(0);
$span->nodeValue = $li->getElementsByTagName('span')->item(1)->nodeValue;
foreach($span->getElementsByTagName('a') as $a) {
    $a->setAttribute('class', 'level2 item1 first');
}

$ul = $doc->getElementsByTagName('ul')->item(0);

$nodes = $ul->getElementsByTagName('a');
$node = $ul->childNodes->item(0);

$i = 2;
foreach($nodes as $n) {
    $n->setAttribute('class', 'level2 item' . $i);
    $i++;
}

$ul->insertBefore($li, $node);

$nodes->item(1)->parentNode->setAttribute('class', 'level2 item1');

echo $doc->saveHTML();

http://codepad.org/pIwwK1Z5

【讨论】:

  • 看起来不错...但是已经有一个小问题,在顶部创建新 li 时,您使用的是硬编码值,并且它必须使用主 li 元素内的 a 标签中的值. 'mainlink.html' 和 'Main title' 只是示例值......它应该采用正在使用的任何其他值并将它们复制到新创建的元素中......
  • 试试这个新的!我可能犯了一些错误。快速编码!
  • 太棒了!现在我需要对其进行一些更改,因为有很多像我帖子中的块一样的块。所以主要结构是: 每个代码[block]都有li类为“level1 item1”,“level1 item2” “level1 item3”...等
猜你喜欢
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
相关资源
最近更新 更多