удалить весь пункт меню LI на основе идентификатора LI - PullRequest
0 голосов
/ 24 февраля 2012

Я работаю со следующим блоком кода:

<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*)/, но я знаю, что это далеко.По сути, мне нужно использовать регулярные выражения для поиска и удаления LI на основе Id, который будет обрабатываться динамически.так что если бы выше было меню, мне нужно было бы удалить 5, например.Если я смогу заставить регулярное выражение выделить 5, например, в http://regexpal.com/, я смогу завершить это.

Обновление: мне нужно использовать функцию, не основанную на js, чтобы выполнить это, поэтому нет jquery.в частности, я использую: http://cfquickdocs.com/cf9/#rematchnocase

Ответы [ 7 ]

1 голос
/ 24 февраля 2012

Реальный ответ здесь заключается в том, что вы не должны использовать регулярное выражение для разбора HTML , потому что HTML не является регулярным языком.

Вместо этого используйте библиотеку Java JSOUP из вашего CF-кода для управления HTML-кодом, с которым вы работаете.

После того, как вы скачаете jar-файл и добавите его в ваш путь к классам CF, вы сможете делать такие вещи:*

Я протестировал это, и он выводит именно то, что вы просите - оригинальный HTML без указанного элемента LI.

1 голос
/ 24 февраля 2012

Не уверен насчет синтаксиса, специфичного для Coldfusion, но если он поддерживает не жадные квантификаторы, тогда это будет работать.

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

См. http://refiddle.com/1r7

0 голосов
/ 26 февраля 2012

Спасибо моему товарищу по команде @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#">
0 голосов
/ 24 февраля 2012

Я бы сделал это следующим образом ... Он не использует 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 голосов
/ 24 февраля 2012

Я думаю, что выражение, предоставленное Kolink, будет служить вам лучше всего. Предполагая, что ваш HTML хранится в переменной с именем «htmllist», этот код должен работать:

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

Как упоминал Джейк Физел, 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 голосов
/ 24 февраля 2012

Вы, кажется, пометили свой вопрос слишком многими языками, чтобы иметь смысл, но вот ответ для 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 голосов
/ 24 февраля 2012

Вы отметили свой вопрос с помощью jQuery, поэтому:

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

Сделаем это. Или, если идентификатор находится в переменной:

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

Вам не нужно беспокоиться о выборе по типу элемента, потому что вы присваиваете уникальные идентификаторы, верно?

Или удалить элемент _n_th li:

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