-1

我有一个带有子菜单的 html ul 菜单。我想用 PHP 在子菜单的第一项中添加一个“first-item”类。

<ul id="menu-main" class="menu">
  <li id="menu-item-68" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-68"><a href="...">ITEM1</a></li>
  <li id="menu-item-69" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-69"><a href="...">ITEM2</a>
  <ul class="sub-menu">
    <li id="menu-item-70" class="first-item menu-item menu-item-type-post_type menu-item-object-page menu-item-70"><a href="...">SUB-ITEM-1</a></li>
    <li id="menu-item-71" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-71"><a href="...">SUB-ITEM2</a></li>
  </ul>
  <li id="menu-item-73" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-73"><a href="...">ITEM3</a></li>
</ul>

(在文本中查找“第一项”)

到目前为止,我遇到了类似的事情:

$output = preg_replace('/(sub-menu.*class.*)menu-item/smi', '$1 first-item menu-item', $output, 1);
4

3 回答 3

1

首先,第二个<li>缺少结束</li>。修复该问题将允许您使用它,它使用 DOMDocument / DOMXPath 来更改<li>子菜单中第一个的类:

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

$xpath = new DOMXPath( $doc);
$first_node = $xpath->query( '//ul[@id="menu-main"]/ul[@class="sub-menu"]/li')->item(0);

$new_class = $doc->createAttribute( "class");
$new_class->appendChild( $doc->createTextNode( "first-item "));
$new_class->appendChild( $doc->createTextNode( $first_node->getAttributeNode("class")->value));

$first_node->setAttributeNode( $new_class);

这导致<li>子菜单中的第一个看起来像

string(198) "<li id="menu-item-70" class="first-item menu-item menu-item-type-post_type menu-item-object-page menu-item-70"><a href="...">SUB-ITEM-1</a></li>" 
于 2012-07-19T14:31:09.277 回答
1

为此,请使用 jQuery 或 JavaScript。

这是使用 jQuery 的一种方法:

$('.sub-menu').find('li:first-child').addClass('first-item');
于 2012-07-19T14:32:38.293 回答
1

使用DOMDocumentDOMXPath会好得多。它们提供了导航 DOM 的方法。您将使用类似下面的内容来查找子菜单(虽然我没有测试过它,所以 xpath 可能不完全正确)。一旦你找到了你感兴趣的 DOM 元素,你就可以修改它的 class 属性。

$dom = new DOMDocument ();
$dom -> loadHTML ($htmlString);
$path = new DOMXpath ($dom);

$firstItem = $path -> query ('//ul[@id="main-menu"]//ul[@class="sub-menu"]/li[1]');
于 2012-07-19T14:15:20.027 回答