2012-02-23 59 views
0

我用下面的代码块时删除整个菜单李项:根据李ID

<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例如。如果我可以让正则表达式工作,例如在http://regexpal.com/中突出显示5,我应该可以将其包装起来。

更新: 我需要使用非js基础的功能来完成这个,所以没有jQuery。特别是我现在用的是:http://cfquickdocs.com/cf9/#rematchnocase

+1

根据HTML规范,以数字开头的ID不合法。 – 2012-02-23 21:09:34

+1

我可以让他们开始,身份证,不用担心,这是seudo代码:)我现在会修复它 – 2012-02-23 21:10:49

+0

为什么你使用正则表达式? $('#5')。remove()不起作用?或$('li [id =“5”]')。remove()? – 2012-02-23 21:10:53

回答

0

谢谢你对我的队友@Alex布朗的更新正则表达式的功能,@保罗亚历山大在PHP/CF版本和@飞溅-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#"> 
0

您已经标记了使用jQuery你的问题,所以:

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

会做到这一点。或者,如果ID是一个变量:

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

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

或删除的_n_th li元素:

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

抱歉,我无法使用jquery – 2012-02-23 21:19:06

+0

@chrishough为什么你把它标记为jquery比? – 2012-02-23 21:21:43

+0

@DamienPirsy我修正了这个线程。 – 2012-02-23 21:50:18

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(); 
?> 
+0

是的,我修正了,我的不好。我正在寻找正则表达式模式,我的错误。对不起 – 2012-02-23 21:18:55

+1

在这种情况下,[小马他来...](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) – 2012-02-23 21:20:33

+0

我试过这个帖子“<(?:”[^“] *”['“] * |'[^'] *'['”] * | [^'“>]] +>”get我的lis,但我需要找到一个基于传入的值,如id5 – 2012-02-23 21:24:09

1

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

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

看到它http://refiddle.com/1r7

+0

嗯......你能在这里成功测试吗? http://regexpal.com/ – 2012-02-23 21:37:16

+0

你可以看到它的工作在http://refiddle.com/1r7 – 2012-02-23 21:38:19

+0

无视最后的评论,我现在要测试,看看它是如何工作 – 2012-02-23 21:39:35

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。

0

我认为Kolink提供的表达方式会为您提供最好的服务。假设你有存储在一个名为“htmllist”可变你的HTML,该代码应工作:

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

正如杰克Feasel提到的,HTML是不规律的,但这应该工作。如果您的问题变得更加复杂(例如,如果您需要针对不同属性之间的关系采取措施),基于XML的解决方案可能会为您提供良好的服务。

假设您的“htmllist”变量包含周围的“UL”标记并且是有效的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)> 

这对解决原始问题没有好处,但如果它变得更加复杂,可能有助于作为一个起点。

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> 
+0

这当然是比我的建议更直接的方法,不同之处在于你的情况,你假设有效的XHTML,而我认为答案应该支持简单的HTML。不过,我喜欢RegExp上的两种方法。 – 2012-02-24 22:56:28