doufangxie0203 2010-10-18 10:52
浏览 87
已采纳

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

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>

How to add some class for the first and the last <li>?

Need a regex solution.

echo $ul; should give (if we add class my_class for the last <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>
  • 写回答

5条回答 默认 最新

  • dqudtskm49788 2010-10-18 11:05
    关注

    The DOM solution

    $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' ) );
    

    If you know the HTML to be valid, you can also use loadXML instead. That would make DOM not add ther HTML skeleton. Note that you have to change the XPath to '/ul/li[last()]/@class' then.

    In case you are not familiar with XPath queries, you can also use the regular DOM interface, e.g.

    $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' ) );
    

    EDIT Since you changed the question to have classes for first and last now, here is how to do that using XPath. This assumes your markup is valid XHTML. If not, switch back to loadHTML (see code above):

    $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 );
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路
  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应