我有一个动态菜单,看起来像
<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 Parser
和strtr()
将解决这个问题…
$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);