将最后一个类替换为 php

发布于 2024-11-17 00:45:27 字数 941 浏览 0 评论 0原文

$list = '<ul>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
</ul>';

如何将最后一个

  • 的班级从“女人”替换为“男人”?
  • 我们最终应该得到:

    $list = '<ul>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="man">photo</li>
    </ul>';
    
    $list = '<ul>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    </ul>';
    

    How do I replace last <li>'s class from 'woman' to 'man'?

    We should get finally:

    $list = '<ul>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="man">photo</li>
    </ul>';
    

    如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

    扫码二维码加入Web技术交流群

    发布评论

    需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

    评论(4

    小糖芽 2024-11-24 00:45:28

    使用正则表达式(默认情况下是贪婪的),这非常简单:

    $list = preg_replace ('#^(.*class=")woman(".*)$#s', '$1man$2', $list);
    

    这不会考虑该类可能位于 LI 标记之外的其他内容上,或者如果最后一个 LI 标记没有类。要修复第一个,您只需更改正则表达式即可:

    $list = preg_replace ('#^(.*<li class=")woman(".*)$#s', '$1man$2', $list);
    

    要修复最后一个:

    $list = preg_replace ('#^(.*)<li[^>]*>(.*)$#s', '$1<li class="man">$2', $list);
    

    With a regular expression (which is greedy by default), it is quite easy:

    $list = preg_replace ('#^(.*class=")woman(".*)$#s', '$1man$2', $list);
    

    That won't take into account that the class might be on something other than an LI tag or if the last LI tag has no class. To fix the first, you can simply change the regex:

    $list = preg_replace ('#^(.*<li class=")woman(".*)$#s', '$1man$2', $list);
    

    To fix the last:

    $list = preg_replace ('#^(.*)<li[^>]*>(.*)$#s', '$1<li class="man">$2', $list);
    
    累赘 2024-11-24 00:45:28

    两种选择:

    1. 使用正则表达式并根据您的需要制定正则表达式。例如,用不同的值替换最后一个 li 块类属性。

      $list = preg_replace('#^(.*

    2. .*
    3. .*)$#s', '$1man $3', $list);

    4. 从片段生成一个 DOM 树,并使用 xpath 来定位最后一个 li 元素。 (DOM - 文档

    Two options:

    1. Use regular expressions and formulate the regular expression according to your needs. E.g. replace the last li blocks class attribute with a different value.

      $list = preg_replace('#^(.*<li class=")(.*)(">.*</li>.*)$#s', '$1man$3', $list);

    2. Generate a DOM-Tree from the fragment and use xpath to adress the last li element. (DOM - documentation

    浅紫色的梦幻 2024-11-24 00:45:28

    尝试:

    $off = strripos ( $list , "class=");
    $list = substr_replace ( $list , "man" , $off+7, 5);
    

    我认为这是迄今为止执行该技巧的最简单方法,根本不需要正则表达式!

    Try:

    $off = strripos ( $list , "class=");
    $list = substr_replace ( $list , "man" , $off+7, 5);
    

    I think this is, by far, the simplest way to perform the trick, and no regexp needed at all!

    不美如何 2024-11-24 00:45:28

    找不到合适的重复项,因此这是 DOM 解决方案:

    $list = '<ul>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    </ul>';
    
    $dom = new DOMDocument;
    $dom->preserveWhiteSpace = false;
    $dom->loadXml($list);
    $dom->documentElement->lastChild->setAttribute('class', 'man');
    $dom->formatOutput = true;
    echo $dom->saveXml($dom->documentElement);
    

    http://codepad.org/6MVEytcp

    如果您的标记不符合 XML,或者如果它是完整的 html 页面,请考虑使用 loadHTML 来使用 libxml 的 HTML 解析器模块。在这种情况下,请在 StackOverflow 上搜索或通过我的答案进行搜索。有很多例子。

    Couldn't find a suitable duplicate, so here is the DOM solution:

    $list = '<ul>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    <li class="woman">photo</li>
    </ul>';
    
    $dom = new DOMDocument;
    $dom->preserveWhiteSpace = false;
    $dom->loadXml($list);
    $dom->documentElement->lastChild->setAttribute('class', 'man');
    $dom->formatOutput = true;
    echo $dom->saveXml($dom->documentElement);
    

    http://codepad.org/6MVEytcp

    If your markup is not XML compliant or if its a full html page consider using loadHTML to use libxml's HTML parser module. In that case, search around on StackOverflow or through my answers. There is plenty examples.

    ~没有更多了~
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文