Php 除去不必要的li

Php 除去不必要的li,php,html,Php,Html,echo$nav给出如下代码: <ul> <li class="someclass">sometext <ul> <li class="someclass">sometext</li> <li class="spacer"></li> <li class="someclass">sometext</l

echo$nav
给出如下代码:

<ul>
    <li class="someclass">sometext
        <ul>
            <li class="someclass">sometext</li>
            <li class="spacer"></li>
            <li class="someclass">sometext</li>
            <li class="spacer"></li>
            <li class="someclass">sometext</li>
            <li class="spacer"></li>
            <li class="someclass">sometext</li>
            <li class="spacer"></li>
        </ul>
    </li>
    <li class="spacer"></li>
    <li class="someclass">sometext</li>
    <li class="spacer"></li>
</ul>
  • sometext
    • sometext
    • sometext
    • sometext
    • sometext
  • sometext
在每个子级
ul
中,在每个正常列表项之后,都有带有class
间隔符的列表项。
如何使用PHP删除主列表的子列表项 示例:



我正在搜索一个正则表达式,它应该只删除子
    元素中的
  • str\u replace
    怎么样

        $nav = str_replace('<li class="spacer"></li>','',$nav);
    
    “容易”是相对的。这取决于几件事。如果需要,请修改生成
    $nav
    的位置。

    尝试以下操作:

    $nav = str_replace('<li class="spacer"></li>', '', $nav);
    
    $nav=str_replace(“
  • ”,“$nav”);
    使用preg\u replace替换li标签:

    $new_nav = preg_replace('/<li class="spacer"></li>/', '', $nav);
    echo $nav;
    
    $new\u nav=preg\u replace('/
  • /,'','$nav); echo$nav;
    如果您无法访问
    $nav
    变量来删除它(您可能会这样做),那么我只需要使用CSS来隐藏它,类似这样的方法应该可以:

    li ul li.spacer {
      display:none;
    }
    
    但是,如果您有权访问
    $nav
    ,请从代码中删除该间隔符li。简单


    另外,在旁注上。将页面上的空元素作为“间隔符”在语义上是不好的。这应该通过CSS来处理,在页面上的其他元素上添加边距/填充,不要使用一类间隔符,如果这样做,那么您最好返回到到处使用零散的

    标记来创建空间。

    有多种方法:

  • 不要创建它。如果你不去创造一些你不想要的东西,这会更容易。它将更容易维护。所以,如果您可以控制生成
    $var
    字符串的内容,只需更改它

  • 只需这样替换它:
    str\u replace('
  • ,$var)

  • 使用一些HTML解析器并删除节点

  • 使用JavaScript删除客户端上的

  • 使用
    substr\u replace
    strpos
    代替
    str\u replace
    ,并在第一个垫片后指定偏移量

    添加以下CSS

    ul ul li.spacer { display: none; }
    
    这是转换为XML(使用最新的PHP5.3版本和DOMDocument导出为HTML)。输出:

    
    
    • sometext
      • sometext
      • sometext
      • sometext
      • sometext
    • sometext

    编辑创建
    $nav
    的代码?这里没有足够的信息…我是不是遗漏了什么?你试过退格吗?不要删除它们,只是不要添加它们。这个问题很愚蠢。解决方案并不是通过掩盖问题的根源来“修复”的,而问题的根源正是额外的垫片产生的地方。从它们第一次输入代码的位置删除它们。@ParPar在
    ul
    元素中不能有换行符。它们必须在
    li
    中才能有效,而且,您不应该使用换行符或“特殊”lis来格式化布局。只应删除ul child li-child.Spaker。在通用ul中带有类“间隔符”的Li应该存在此代码删除了所有间隔符Li,应该只适用于孩子ulsee您在问题中添加的额外要求,我想说最简单的方法是使用JS,而不是使用PHPjs尝试此方法将导致跳转效应,当加载时,因此页面将被错误打开,然后它将被js修复,当它被加载时——“跳跃效应”。它不好,我不能直接编辑生成它的代码。所以方法是使用pre_replace,搜索正确的regex@steve你说过几次你不能,但我想我还没有看到一个解释来解释为什么你不能。这似乎是使用正则表达式的最快方法,有解决方案吗?我不支持regexp,因为每个li都有nbsp;用密码。因此显示:none不能修复IE7中的空白错误这些
  • 应该在子ul中删除
    ul ul li.spacer { display: none; }
    
    $xml = new SimpleXMLElement($nav);
    $spacers = $xml->xpath('li//li[@class="spacer"]');
    foreach($spacers as $i => $n) {
      unset($spacers[$i][0]);
    }
    echo $xml->asXML();
    
    <?xml version="1.0"?>
    <ul>
        <li class="someclass">sometext
            <ul>
                <li class="someclass">sometext</li>
    
                <li class="someclass">sometext</li>
    
                <li class="someclass">sometext</li>
    
                <li class="someclass">sometext</li>
    
            </ul>
        </li>
        <li class="spacer"/>
        <li class="someclass">sometext</li>
        <li class="spacer"/>
    </ul>