我正在尝试将连续类添加到类别为“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,因为我宁愿这样做一次并定位所有列表(虽然这可能是一个开始)。
有什么想法吗?
答案 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);
}
答案 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";
}