【问题标题】:Add dynamic classes to an unordered list with PHP使用 PHP 将动态类添加到无序列表
【发布时间】:2011-06-08 08:34:34
【问题描述】:

我正在尝试将连续的类添加到具有“导航”类的列表中的所有列表项。本质上,我希望每个列表项都有一个“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 为目标,因为我宁愿只做一次并以所有列表为目标(尽管这可能是一个开始)。

有什么想法吗?

【问题讨论】:

  • 标记是由 PHP 生成的,还是您尝试使用 PHP 修改现有标记并添加类?如果是前者,请发布生成标记的 PHP。

标签: php html dom html-lists


【解决方案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.

【讨论】:

  • 这看起来更具可扩展性和我所在的路径,但是当我将此代码放在外部文件中并在文档中调用该文件时。它不会改变任何东西。这就是我所说的:
  • @kevdev 您需要将 HTML 源代码传递给文件,然后输出/保存或缓存输出。
  • 那么,您的意思是添加如下变量吗? $markup = '';
  • @kevdev 是的,需要将其作为字符串传递给DOMDocument-&gt;loadHTML(),除非是文件,可以使用loadHTMLFile()方法。
【解决方案2】:

我想您不使用任何模板系统(如 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>

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

【讨论】:

  • 这可行,但我可以在将 PHP 保存在外部文件中并针对每个导航的同时做到这一点吗?我不想将它包含在每个无序列表的标记中。此外,列表项的内部内容可能会有所不同(有些内部有“a”标签)。
  • 好吧,如果您想在代码的更多地方使用此解决方案,您可以编写将生成&lt;li&gt;s 的函数。它的内容将相似,您可能只需要使用 2 个参数 - 值数组和类名。您可以根据需要调用此函数,它会始终回显/返回列表。这个函数的基础看起来像这样: function gnerateList($values, $classNAme) { ... }
【解决方案3】:

如果您只有此处显示的列表格式(而不是 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";

}

【讨论】:

    猜你喜欢
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2021-06-05
    • 2016-08-17
    • 2020-08-04
    • 1970-01-01
    • 2014-03-09
    相关资源
    最近更新 更多