2010-10-01 37 views
0

使用Javascript和jQuery或正则表达式,可以像HTML中一样对HTML中的多个兄弟列表项进行分组吗?我需要将TikiWiki标记转换为HTML,并且它使用未分组列表(只是附加#的相邻行)。使用jQuery将列表项目(LI)分组为OL/UL

<li>Item 1.1</li> 
<li>Item 1.2</li> 
<li>Item 1.3</li> 
<p>Paragraph</p> 
<li>Item 2.1</li> 
<li>Item 2.2</li> 

要这样:

<ul> 
<li>Item 1.1</li> 
<li>Item 1.2</li> 
<li>Item 1.3</li> 
</ul> 
<p>Paragraph</p> 
<ul> 
<li>Item 2.1</li> 
<li>Item 2.2</li> 
</ul> 

我已经尝试过使用$("li").wrapAll()siblings()。两个失败。

还有另一种方法。这里是我正在用来将TikiWiki列表转换为HTML列表项目的正则表达式:replace(/[#](.*)\n?/g, "<li class='numbered'>$1</li>")是否可以匹配重复的模式,并将它们相应地转换为HTML,如同这个伪正则表达式? replace(/repeat([#](.*)\n?)/g, "<ol>foreach(<li class='numbered'>$1</li>)</ol>")

回答

0

这是我的第一个破解。这可能让你在正确的方向

<div id='testList'> 
     <li>Item 1.1</li> 
     <li>Item 1.2</li> 
     <li>Item 1.3</li> 
     <p>Paragraph</p> 
     <li>Item 2.1</li> 
     <li>Item 2.2</li> 

    </div> 

<script language='javascript' type='text/javascript'> 

$.fn.tagName = function() { 
    return this.get(0).tagName; 
} 

$(document).ready(function() { 

    alert($("#testList").html()); 

    $("li").each(function() { 
     if ($(this).parent().tagName() != "UL") { 
      $(this).wrap("<ul></ul>"); 
      // alert($(this).parent().tagName()) 
     } 
    }) 

    alert($("#testList").html()); 
}); 
</script> 
+0

顺便说一句 - 这有效地包裹每个锂元素在一个单独的UL – Sage 2010-10-01 18:22:55

0

<p>只是挂在一堆<li>s中间去,表示一组的开头或结尾?那么,也许是这样的:

​$('div#container') // assume you're got it in a container div 
    .find('p').each(function(){ // each p signifies a new group 
    $(this) 
     .prev('li') // walk back to the preceding li 
     .prevUntil('p') // get the set of elements up to the previous p 
     .andSelf() // include the current li 
     .wrapAll('<ul>');​​​​​​​​​​​​​​​​​​​​​​​​​​ // wrap the set in a ul 
    }); 

这里有一个working jsFiddle使用这种方法。

+0

不,这只是一个例子。中间可能有任何东西,甚至可能什么也没有(只有一个列表)。 – Propeng 2010-10-01 18:49:38

+0

好的,那么你可以发布你正在编写的文本的例子吗? – 2010-10-01 19:06:15

+0

它处理来自textarea的输入,所以确实没有静态文本。 – Propeng 2010-10-01 20:00:53