Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于动态菜单正确嵌套的正则表达式_Php_Arrays_Regex_Function_Dom - Fatal编程技术网

Php 用于动态菜单正确嵌套的正则表达式

Php 用于动态菜单正确嵌套的正则表达式,php,arrays,regex,function,dom,Php,Arrays,Regex,Function,Dom,我有一个动态菜单,看起来像 <li class='has-sub'> cat1</li> <ul> <li> test5</li> <li class='has-sub'> cat2</li> <ul> <li> cat9</li> <li class='has-sub'> cat7</li>

我有一个动态菜单,看起来像

<li class='has-sub'> cat1</li>
<ul>
    <li> test5</li>
    <li class='has-sub'> cat2</li>
    <ul>
        <li> cat9</li>
        <li class='has-sub'> cat7</li>
        <ul>
            <li> cat8</li>
            <li> cat10</li>
            <li> cat1 cat2</li>
        </ul>
    </ul>
</ul>
<li class='has-sub'> cat3</li>
<ul>
    <li> cat5</li>
</ul>
  • cat1
    • 测试5
    • cat2
      • 第九类
      • cat7
        • 第八类
        • cat10
        • 第1类第2类
  • cat3
    • 第五类
    我想将其更改为正确嵌套的导航菜单,如

    <li class='has-sub'> <a href='#'><span>cat1</span></a>
    <ul>
        <li><a href='#'><span> test5</span></a></li>
        <li class='has-sub'><a href='#'><span> cat2</span></a>
        <ul>
            <li> <a href='#'><span>cat9</span></a></li>
            <li class='has-sub'> <a href='#'><span>cat7</span></a>
            <ul>
                <li> <a href='#'><span>cat8</span></a></li>
                <li> <a href='#'><span>cat10</span></a></li>
                <li> <a href='#'><span>cat1 cat2</span></a></li>
            </ul>
            </li>
        </ul>
        </li>
    </ul>
    </li>
    <li class='has-sub'> <a href='#'><span>cat3</span></a>
    <ul>
        <li> <a href='#'><span>cat5</span></a></li>
    </ul>
    </li>
    
  • 我尝试了几次str_replace,但由于列表是动态的,所以无法工作。 我不熟悉正则表达式,不知道如何将此动态菜单格式化为正确嵌套/格式化的菜单


    提前谢谢

    这是一个链接到的答案,可能比读到的要多,但仍然:。无论如何都不可靠。
    相反,您应该使用类似的解析器。这里的基本用法是:

    $dom = new DOMDocument();
    $dom->loadHTML($theMarkupString);
    //get the list:
    $list = $dom->getElementById('navContainerID');
    $navItems = $list->getElementsByTagName('li');
    foreach($navItems as $item)
    {
        //add spans, links, classes... how to do so is all in the doc pages
    }
    
    一个简单而简单的方法可以解决这个问题

    $dom = new DOMDocument;
    $dom->loadHTML($html);
    $arrLi = array();
    foreach ($dom->getElementsByTagName('li') as $tag) {
      $arrLi[$tag->nodeValue]="<a href='#'><span>$tag->nodeValue</span></a>";
    }
    echo $html = strtr($html,$arrLi);
    
    $dom=新的DOMDocument;
    $dom->loadHTML($html);
    $arrLi=array();
    foreach($dom->getElementsByTagName('li')作为$tag){
    $arrLi[$tag->nodeValue]=“”;
    }
    echo$html=strtr($html$arrLi);
    

    为什么没有在超链接中添加cat9?对不起,已经添加了!我现在就纠正它。你只需要一个正则表达式解决方案吗?@ICanHasCheezburger我知道正则表达式对动态事物很有用。我同意任何其他解决方案,如果它能正确嵌套@now-r-never:Regex在某些方面很好,但解析标记超出了它的能力。Regex和markup不能很好地混合,请查看
    DOMDocument
    ,以解析markupSorry!我不明白怎么用这个做筑巢!你能详细说明一下吗?@now-r-never:RTM,就在这里:
    DOMDocument
    是一个完整的domapi。它有
    createElement
    removeChild
    等方法,以及
    replaceChild
    。只需阅读一些文档,不要期望得到可以复制粘贴的答案