删除不必要的李

时间:2012-02-09 17:20:39

标签: php html

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>

在每个正常列表项之后,每个子spacer内都有类ul的列表项。
如何使用PHP删除作为主列表的孙子的spacer列表项? 示例: <ul> <li> <ul> <li class="spacer">


我正在搜索正则表达式,该表达式只会在子<li class="spacer"></li>元素中删除<ul>

9 个答案:

答案 0 :(得分:1)

如果您无法访问$nav变量来删除它(您可能会这样做),那么我只是使用CSS来隐藏它,这样的事情应该有效:

li ul li.spacer {
  display:none;
}

但是,如果您有权访问$nav - 请从代码中删除spacer li。 Simples

另外,请注意。在页面上有像空格一样的空元素在语义上是坏的。这应该通过CSS处理,在页面上的其他元素上添加边距/填充,不要使用一类spacer,如果你这样做,那么你可以回到每个地方使用流浪<br />标签来创建空格

答案 1 :(得分:1)

$xml = new SimpleXMLElement($nav);
$spacers = $xml->xpath('li//li[@class="spacer"]');
foreach($spacers as $i => $n) {
  unset($spacers[$i][0]);
}
echo $xml->asXML();

这是转换为XML(使用最新的PHP 5.3版本和DOMDocument导出为HTML)。输出:

<?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>

答案 2 :(得分:0)

str_replace怎么样?

    $nav = str_replace('<li class="spacer"></li>','',$nav);

edited code below

根据新要求,此代码有效。我知道它的hacky和马虎但它的确有效:

    $temp = explode("\n",$nav);

    for ($i=0;$i<count($temp);$i++) {

            if (strstr($temp[$i],"<ul>")) {
                    $nested_ul = 1;
            }

            if (strstr($temp[$i],"</ul>")) {
                    $nested_ul = 0;
            }

            if ($nested_ul==0) {
                    if (!strstr($temp[$i],"spacer")) {

                            $new_nav .= $temp[$i]."\n";
                    }
            } else {
                    $new_nav .= $temp[$i]."\n";
            }
    }


    echo $new_nav;

答案 3 :(得分:0)

“轻松”是相对的。这取决于一些事情。如果需要,请修改生成$nav的位置。

答案 4 :(得分:0)

试试这个:

$nav = str_replace('<li class="spacer"></li>', '', $nav);

答案 5 :(得分:0)

使用preg_replace替换li标签:

$new_nav = preg_replace('/<li class="spacer"></li>/', '', $nav);
echo $nav;

答案 6 :(得分:0)

有多种方式:

  1. 不要创建它。如果你不创造你不想要的东西会更容易。它将更容易维护。因此,如果您对$var字符串中生成的内容有任何控制权,请更改它。

  2. 只需将其替换为:str_replace('<li class="spacer"></li>', $var)

  3. 使用一些HTML解析器并删除节点。

  4. 使用JavaScript在客户端删除<li class="spacer"></li>

答案 7 :(得分:0)

使用substr_replacestrpos代替str_replace,并在第一个间隔符后面指定偏移量。

http://www.php.net/manual/en/function.substr-replace.php

http://www.php.net/manual/en/function.strpos.php

答案 8 :(得分:0)

添加以下CSS

ul ul li.spacer { display: none; }
相关问题