根据LI ID删除整个菜单LI项

时间:2012-02-23 21:08:45

标签: regex coldfusion pattern-matching

我正在使用以下代码块:

<li class="standby" id="id4"> 
<a href="www.google.com" target="_self" title="Contact Information"> Contact Information<font class="menuItemType">(BB)</font></a></LI>
<li class="standby" id="id5"> 
<a href="www.google.com" target="_self" title="Contact Information"> Contact Information<font class="menuItemType">(BB)</font></a></LI>
<li class="standby" id="id6"> 
<a href="www.google.com" target="_self" title="Contact Information"> Contact Information<font class="menuItemType">(BB)</font></a></LI>
<li class="standby" id="id7"> 
<a href="www.google.com" target="_self" title="Contact Information"> Contact Information<font class="menuItemType">(BB)</font></a></LI>

我有很多不同的模式,但我似乎无法为我需要的工作。我一直在与/^(?:<li>.*?</li>\s*)/合作,但我知道它已经过时了。基本上我需要使用正则表达式来查找和删除基于Id的LI,这将动态处理。所以,如果以上是一个菜单,我需要删除5例如。如果我可以让正则表达式工作突出显示5,例如在http://regexpal.com/中,我应该能够将其包装起来。

更新: 我需要使用基于非js的函数来实现这一点,所以没有jquery。特别是我使用的是:http://cfquickdocs.com/cf9/#rematchnocase

7 个答案:

答案 0 :(得分:1)

不确定coldfusion特定的语法,但如果它支持非贪婪的量词,那么这将有效。

/<li[^>]*id="id5"[\s\S]*?<\/li>/i

http://refiddle.com/1r7

上查看

答案 1 :(得分:1)

这里真正的答案是you should not be using a regular expression to parse HTML,因为HTML不是常规语言。

相反,请使用CF代码中的Java库JSOUP来操作您正在使用的HTML。

下载jar并将其添加到CF类路径后,您可以执行以下操作:

<cfset jsoup = CreateObject("java", "org.jsoup.Jsoup")>
<cfsavecontent variable="html">
<li class="standby" id="id4"> 
<a href="www.google.com" target="_self" title="Contact Information"> Contact Information<font class="menuItemType">(BB)</font></a></LI>
<li class="standby" id="id5"> 
<a href="www.google.com" target="_self" title="Contact Information"> Contact Information<font class="menuItemType">(BB)</font></a></LI>
<li class="standby" id="id6"> 
<a href="www.google.com" target="_self" title="Contact Information"> Contact Information<font class="menuItemType">(BB)</font></a></LI>
<li class="standby" id="id7"> 
<a href="www.google.com" target="_self" title="Contact Information"> Contact Information<font class="menuItemType">(BB)</font></a></LI>
</cfsavecontent>

<cfset htmlObj = jsoup.parse(html)>
<cfset htmlObj.select('##id7').remove()>

<cfoutput>#htmlObj.html()#</cfoutput>

我已经对此进行了测试,它会输出您要求的内容 - 没有指定LI元素的原始HTML。

答案 2 :(得分:0)

您已使用jQuery标记了您的问题,因此:

$("#id5").remove();

会这样做。或者如果id在变量中:

var someId = "id5";
$("#" + someId).remove();

您不必担心按元素类型选择,因为 分配唯一ID?

或者删除_n_th li元素:

$("li").eq(4).remove(); // remove fifth element (zero-based indexes)

答案 3 :(得分:0)

您似乎用太多语言标记了您的问题,但这是PHP的答案:

<?php
$dom = new DOMDocument();
$dom->loadXML($data); // $data is your HTML stuff
// using loadXML so you don't get <html>, <head> and <body> tags added
$node = $dom->getElementById('5');
$node->parentNode->removeChild($node);
$result = $dom->saveXML();
?>

答案 4 :(得分:0)

我认为Kolink提供的表达方式将为您提供最佳服务。假设您将HTML存储在名为&#34; htmllist&#34;的变量中,则此代码应该有效:

<cfset htmllist = ReReplaceNoCase(htmllist,'<li[^>]+id="id5".*?</li>\s*','','ALL')>

正如Jake Feasel所说,HTML并不是常规的,但这应该有效。如果您的问题变得更加复杂(例如,如果您需要对不同属性的相关性采取措施),基于XML的解决方案可能会为您提供良好的服务。

假设你的&#34; htmllist&#34;变量包括周围的&#34; UL&#34;标签是有效的XML,以下代码将等同于上面发布的正则表达式解决方案。

<cfset htmllist = ReplaceNoCase(htmllist,"LI>","li>","ALL")>
<cfset xLis = XmlParse(htmllist,false)>
<cfloop index="ii" from="#ArrayLen(xLis.ul.li)#" to="1" step="-1">
    <cfif xLis.ul.li[ii].XmlAttributes["id"] EQ "id5">
        <cfset ArrayDeleteAt(xLis.ul.li,ii)>
    </cfif>
</cfloop>
<cfset htmllist = htmllist = ToString(xLis)>

解决原始问题并不是更好,但如果它变得更复杂,可能会有所帮助。

答案 5 :(得分:0)

我会这样做...它不使用rematchnocase,而是使用ColdFusion XML实用程序,XMLSearch / XPath查询,并返回预期的结果。您需要添加根元素(ul)。

<cfxml variable="list" casesensitive="false" >
<ul>
    <li class="standby" id="id4"> 
        <a href="www.google.com" target="_self" title="Contact Information"> Contact Information<font class="menuItemType">(BB)</font></a></li>
    <li class="standby" id="id5"> 
        <a href="www.google.com" target="_self" title="Contact Information"> Contact Information<font class="menuItemType">(BB)</font></a></li>
    <li class="standby" id="id6"> 
        <a href="www.google.com" target="_self" title="Contact Information"> Contact Information<font class="menuItemType">(BB)</font></a></li>
    <li class="standby" id="id7"> 
        <a href="www.google.com" target="_self" title="Contact Information"> Contact Information<font class="menuItemType">(BB)</font></a></li>
</ul>   
</cfxml>
<cfset idToDelete = 'id6'>
<cfset list =  XMLSearch(list,"//li[@id!='#idToDelete#']")>
<cfoutput>#ArrayToList(list,"")#</cfoutput>

答案 6 :(得分:0)

感谢我的队友@Alex Brown提供更新的正则表达式函数,感谢@Paul Alexander在php / cf版本上的正确方向,感谢@ Splash-x @nnnnn我需要的jquery版本。这是cf端的测试用例,一旦我得到jquery设置就会更新:

<cfsavecontent variable="Psuedo">
<li class="standby" id="id4"> 
<a href="www.google.com" target="_self" title="Contact Information"> Contact Information<font class="menuItemType">(BB)</font></a></LI>
<li class="standby" id="id5"> 
<a href="www.google.com" target="_self" title="Contact Information"> Contact Information<font class="menuItemType">(BB)</font></a></LI>
<li class="standby" id="id6"> 
<a href="www.google.com" target="_self" title="Contact Information"> Contact Information<font class="menuItemType">(BB)</font></a></LI>
<li class="standby" id="id7"> 
<a href="www.google.com" target="_self" title="Contact Information"> Contact Information<font class="menuItemType">(BB)</font></a></LI> 
</cfsavecontent>
<cfscript >
t=structNew();
//find one and kill it
t.Psuedo=Psuedo;
t.1.testCase1='<li[^>]*?id="id5".*?li>';
t.1.after1=reReplaceNoCase(t.Psuedo,t.1.testCase1,"","All");
t.1.testCase2='<li[^>]*?id="id4".*?li>';
t.1.after2=reReplaceNoCase(t.1.after1,t.1.testCase2,"","All");
t.1.testCase3='<li[^>]*?id="id7".*?li>';
t.1.after3=reReplaceNoCase(t.1.after2,t.1.testCase3,"","All");
//find more than 1 and kill them
t.2.testCase1='<li[^>]*?id="id(5|7)".*?li>';
t.2.after1=reReplaceNoCase(t.Psuedo,t.2.testCase1,"","All");
</cfscript>
<cfdump var="#t#">