我目前正在使用以下伪代码块来修复我遇到的正则表达式问题。目前我正在使用正则表达式来查找/删除基于id的各种菜单项,但是,它仅适用于儿童,而不是父记录。所以在这个例子中我试图删除id53,如果你运行伪代码,你会看到它破坏了树的结构b / c它不会删除整个<li></li>
块。
任何人对如何调整我们正在使用的正则表达式测试模式有任何想法?我非常感谢你的帮助,希望你有一个愉快的一周。
<cfsavecontent variable="pseudo">
<ul id="nav-main-links">
<li class="standby" id="id61"><a href="/?event=User.Home.dspHome" target="_self" title="Home"> Home<font class="menuItemType">(CB)</font></a>
<li class="standby" id="id53"><a href="/contactus.cfm" target="_self" title="Contacts"> Contacts<font class="menuItemType">(L)</font></a>
<ul class="sub-nav-main-links nestingLevel1">
<li class="standby" id="id54"><a href="http://test/index.cfm" target="_self" title="Ven"> Ven<font class="menuItemType">(X)</font></a></li>
<li class="standby" id="id55"><a href="http://test/spEvents.cfm" target="_self" title="SponsorShip"> SponsorShip<font class="menuItemType">(L)</font></a></li>
</ul>
</li>
</ul>
</cfsavecontent>
<cfscript>
myDisplay=structnew();
myDisplay.pseudo=pseudo;
myDisplay.IdsToRemove="53";
myDisplay.RegExTestPattern='<li[^>]*?id="id(' & myDisplay.IdsToRemove & ')".*?li>';
myDisplay.Menu=reReplaceNoCase(myDisplay.pseudo,myDisplay.RegExTestPattern,"","All");
</cfscript>
<cfdump var="#myDisplay#">
答案 0 :(得分:2)
编写正则表达式解决方案需要一个递归正则表达式,我不知道CFML是否支持它。正如我评论的那样,XML DOM操作是可行的方法。它看起来像这样(未经测试,因为我无法访问ColdFusion服务器。
<cfsavecontent variable="pseudo">
<ul id="nav-main-links">
<li class="standby" id="id61"><a href="/?event=User.Home.dspHome" target="_self" title="Home"> Home<font class="menuItemType">(CB)</font></a>
<li class="standby" id="id53"><a href="/contactus.cfm" target="_self" title="Contacts"> Contacts<font class="menuItemType">(L)</font></a>
<ul class="sub-nav-main-links nestingLevel1">
<li class="standby" id="id54"><a href="http://test/index.cfm" target="_self" title="Ven"> Ven<font class="menuItemType">(X)</font></a></li>
<li class="standby" id="id55"><a href="http://test/spEvents.cfm" target="_self" title="SponsorShip"> SponsorShip<font class="menuItemType">(L)</font></a></li>
</ul>
</li>
</ul>
</cfsavecontent>
<cfscript>
myDisplay=structnew();
myDisplay.IdsToRemove = "53";
idVal = 'id' & myDisplay.IdsToRemove;
xmlTree = xmlParse(pseudo);
liList = xmlSearch(xmlTree, '//li[@id="' & idVal & '"]');
arrayDeleteAt(liList, 0);
myDisplay.pseudo = toString(xmlTree);
</cfscript>
<cfdump var="#myDisplay#">