我正在使用以下代码块:
<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
答案 0 :(得分:1)
不确定coldfusion特定的语法,但如果它支持非贪婪的量词,那么这将有效。
/<li[^>]*id="id5"[\s\S]*?<\/li>/i
上查看
答案 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#">