在php变量中捕获第一个和最后一个<li>

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)

  • +1!太好了!这是我能想到的最干净的方式(服务器端). (5认同)
  • @Happy在答案中说:如果使用`loadHTML`来加载标记,DOM将切换到它的HTML解析器模块,它将添加HTML骨架,例如doctype,html,body元素.如果你的HTML不是有效的XHTML,你想要`loadHTML`.如果你有有效的标记,你可以使用`loadXML`代替. (3认同)

wil*_*aks 9

或者,您可以#menu li:last-child在CSS中使用" "而不是类名,这样您就不必修改PHP代码.

  • 您应该提到这是CSS3并且在旧版浏览器中不兼容/忽略.我会通过JavaScript做这种事情. (3认同)