使用PHP将动态类添加到无序列表

时间:2011-06-08 00:13:27

标签: php html dom html-lists

我正在尝试将连续类添加到类别为“nav”的列表中的所有列表项。基本上,我希望每个列表项都有一个'nthChild-x'类,其中x代表它在列表中的位置。我是PHP的主要菜鸟,所以很容易。

这是当前的标记:

<ul id="primaryNav" class="nav">
    <li>Blah Blah Uno</li>
    <li>Blah Blah Dos</li>
    <li>Blah Blah Tres</li>
</ul>

我希望此列表呈现如下:

<ul id="primaryNav" class="nav">
    <li class="nthChild-1">Blah Blah Uno</li>
    <li class="nthChild-3">Blah Blah Dos</li>
    <li class="nthChild-3">Blah Blah Tres</li>
</ul>

请不要使用JavaScript或JQuery解决方案回复。我知道如何用JS做这个,但需要这是服务器端。此外,我不一定要定位列表的ID,因为我宁愿这样做一次并定位所有列表(虽然这可能是一个开始)。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您可以使用DOMDocument。

这个将适用于现有的类,并且不会两次添加相同的类。

$dom = new DOMDocument;

$dom->loadHTML($html);

$lists = $dom->getElementsByTagName('ul');

foreach($lists as $list) {
    $index = 1;
    foreach($list->childNodes as $node) {
        if ($node->nodeName != 'li') {
            continue;
        }

        $class = array();

        if ($node->hasAttribute('class')) {
            $class = preg_split('/\s+/', $node->getAttribute('class'));
        }

        $addClass = 'nthChild-' . $index;

        if (in_array($addClass, $class)) {
            continue;
        }

        $class[] = $addClass;

        $node->setAttribute('class', implode(' ', $class));

        $index++;
    }

}

$html = '';

foreach($dom->getElementsByTagName('body')->item(0)->childNodes as $element) {
    $html .= $dom->saveXML($element, LIBXML_NOEMPTYTAG);
}

CodePad

答案 1 :(得分:0)

我想你不使用任何模板系统(如Smarty)来生成它。您必须使用循环生成字段以及将存储迭代次数的整数变量。它可以这样做:

<ul id="primaryNav" class="nav">
    <?php
    $values = array(1 => "Blah Blah Uno", 2 => "Blah Blah Dos", 3 => "Blah Blah Tres");

    for ($i = 1; $i <= 3; $i++) {
        echo "<li class=\"nthChild-" . $i . "\">" . $values[$i] . "</li>";
    }
    ?>
</ul>

这个解决方案很简单,当然有很多更好的方法可以做到这一点。

答案 2 :(得分:0)

如果你只有你在这里显示的格式列表(不在PHP数组中),你可以这样做

$markup = '<ul id="primaryNav" class="nav">
    <li>Blah Blah Uno</li>
    <li>Blah Blah Dos</li>
    <li>Blah Blah Tres</li>
</ul>';

if (preg_match_all("/<li>(.*)<\/li>/U",$markup,$result) > 0)
{
    $newMarkup = "<ul id=\"primaryNav\" class=\"nav\">\n";
    $count = 0;
    foreach ($result[1] as $listElement)
    {
        $count++;
        $newMarkup .= "\t<li class=\"nThCild-{$count}\">$listElement</li>\n";
    }
    print $newMarkup."</ul>\n";

}