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

to94eoyn  于 2023-05-08  发布在  其他
关注(0)|答案(7)|浏览(120)

我正在使用以下代码块:

<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/中,我应该能够 Package 这个。
更新:我需要使用一个非基于js的函数来实现这一点,所以没有jquery。具体来说,我使用的是:http://cfquickdocs.com/cf9/#rematchnocase

odopli94

odopli941#

这里真实的的答案是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。

dfuffjeb

dfuffjeb2#

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

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

yc0p9oo03#

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

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

或者如果id在变量中:

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

你不需要担心按元素类型进行选择,因为你 * 正在 * 分配唯一的id,对吗?
或者删除第n个li元素:

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

qrjkbowd4#

你似乎已经用太多的语言标记了你的问题,但这是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();
?>
wlp8pajw

wlp8pajw5#

我认为Kolink提供的表达式将最好地为您服务。假设你把HTML存储在一个名为“htmllist”的变量中,下面的代码应该可以工作:

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

正如Jake 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)>

这并不能更好地解决原来的问题,但如果问题变得更复杂,作为起点可能会有所帮助。

nkoocmlb

nkoocmlb6#

我会这么做它不使用rematchnocase,而是使用ColdFusion XML实用程序、XMLSearch/XPath查询,并返回预期的结果。您需要添加根元素though(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>
l7mqbcuq

l7mqbcuq7#

感谢我的队友@Alex Brown为我更新了正则表达式函数,感谢@Paul Alexandria 为我提供了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#">

相关问题