Решение DOM
$dom = new DOMDocument;
$dom->loadHTML( $ul );
$xPath = new DOMXPath( $dom );
$xPath->query( '/html/body/ul/li[last()]/@class' )
->item( 0 )
->value .= ' myClass';
echo $dom->saveXml( $dom->getElementById( 'menu' ) );
Если вы знаете, что HTML-код является допустимым, вы также можете использовать loadXML
. Это заставило бы DOM не добавлять скелет HTML. Обратите внимание, что вам нужно изменить XPath на '/ul/li[last()]/@class'
, затем.
Если вы не знакомы с запросами XPath, вы также можете использовать обычный интерфейс DOM, например,
$dom = new DOMDocument;
$dom->loadHTML( $ul );
$liElements = $dom->getElementsByTagName( 'li' );
$lastLi = $liElements->item( $liElements->length-1 );
$classes = $lastLi->getAttribute( 'class' ) . ' myClass';
$lastLi->setAttribute( 'class', $classes );
echo $dom->saveXml( $dom->getElementById( 'menu' ) );
РЕДАКТИРОВАТЬ Поскольку вы изменили вопрос, чтобы теперь иметь классы для первого и последнего, вот как это сделать с помощью XPath. Это предполагает, что ваша разметка является допустимой XHTML. Если нет, переключитесь обратно на loadHTML
(см. Код выше):
$dom = new DOMDocument;
$dom->loadXML( $html );
$xpath = new DOMXPath( $dom );
$first = $xpath->query( '/ul/li[1]/@class' )->item( 0 );
$last = $xpath->query( '/ul/li[last()]/@class' )->item( 0 );
$last->value .= ' last';
$first->value .= ' first';
echo $dom->saveXML( $dom->documentElement );