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
。只需阅读一些文档,不要期望得到可以复制粘贴的答案