菜单id正则表达式挑战

时间:2012-03-20 19:25:22

标签: regex coldfusion

我目前正在使用以下伪代码块来修复我遇到的正则表达式问题。目前我正在使用正则表达式来查找/删除基于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#">

1 个答案:

答案 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#">