Jam*_*mes -2 html php regex parsing dom
echo $ul; // gives this code:
<ul id="menu">
<li id="some_id" class="some_class">...</li>
<li id="some_id" class="some_class">...</li>
<li id="some_id" class="some_class">...</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
如何为第一个和最后一个添加一些类<li>?
需要正则表达式解决方案.
echo $ul;应该给(如果我们添加my_class最后一个类<li>):
<ul id="menu">
<li id="some_id" class="some_class">...</li>
<li id="some_id" class="some_class">...</li>
<li id="some_id" class="some_class my_class">...</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
Gor*_*don 37
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' ) );
Run Code Online (Sandbox Code Playgroud)
如果您知道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' ) );
Run Code Online (Sandbox Code Playgroud)
编辑因为你改变了问题,现在有第一个和最后一个类,这里是如何使用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 );
Run Code Online (Sandbox Code Playgroud)
或者,您可以#menu li:last-child在CSS中使用" "而不是类名,这样您就不必修改PHP代码.