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


regex for proper nesting of dynamic menu

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

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

我想把它改成合适嵌套的导航菜单,比如

<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,但由于列表是动态的,它不会工作。我是Regex的新手,我不知道如何将这个动态菜单格式化为正确嵌套/格式化的菜单。

提前感谢!

这是一个被链接到比它可能被阅读的更多的答案,但仍然:您不能使用regex解析标记。反正不可靠。
相反,您应该使用类似DOMDocument类的解析器。这里的基本用法是:

$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 Parserstrtr()将解决这个问题…

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