正则表达式,如何验证html ul li

时间:2012-09-29 19:08:43

标签: regex groovy

有没有办法验证里面的html标签有一个带有几个li对象的ul(我正在使用groovy)。我需要这样才能检查html是否在单元测试中生成了有效值。

我想:

  • 使用其数据
  • 提取li元素的数量
  • 验证是否在指定类的指定内部,div内部可能是不同的html标签,但我不关心它们
示例文字: <div class="example">...<ul><li>Element1</li><li>Element2</li><ul>...</div>

我尝试过最简单的方法:<li>.+?</li>,我可以提取li元素,但是我需要检查有效的ul div结构。

为什么这不起作用? <div class='example'>.+?<ul>(<li>.+?</li>)*<ul>.+?</div> 怎么会这样?

任何提示?

非常感谢

3 个答案:

答案 0 :(得分:4)

使用像jsoup这样的HTML抓取库比使用普通正则表达式更容易,更有趣。由于jsoup是一个java库,你应该能够使用groovy。

答案 1 :(得分:1)

您可以像XML一样解析它并计算元素:

def html = '''
  <html>
    <ul>
      <li>item 1</li>
      <li>item 2</li>
      <li>item 3</li>
      <li>item 4</li>
    </ul>
  </html>'''

def htmlNode = new XmlParser().parseText html

assert htmlNode.ul.li.size() == 4

如果html没有正确关闭标签和内容,您可以使用像NekoHTML这样的库来规范化HTML

答案 2 :(得分:1)

使用jsoup,请考虑此测试(如下)。

注意:

  • 它不使用正则表达式,但根据其他答案,这是一个坏主意。
  • verifyHtml()方法接受HTML片段。

示例:

import groovy.util.*
import org.jsoup.*
import org.jsoup.nodes.* 
import org.jsoup.select.* 

class HtmlTester extends GroovyTestCase {
    // returns true if fragment has:
    // <div class='list'> <ul> <li> ... </li> </ul> </div>
    def verifyHtml(String htmlFragment) {
        Document doc = Jsoup.parse(htmlFragment)
        Elements divs = doc.select("div.list ul li")
        boolean result = (divs.size() > 0)

        return result
    }

    void testDivNoClass() {
        def htmlDivNoClass = "<div><ul><li>list 1</li></ul></div>"        
        assertFalse verifyHtml(htmlDivNoClass)
    }

    void testDivNoUl() {
        def htmlDivNoUl = "<div class='list'></div>"        
        assertFalse verifyHtml(htmlDivNoUl)
    }

    void testDivUlNoLi() {
        def htmlDivUlNoLi = "<div class='list'><ul></ul></div>"        
        assertFalse verifyHtml(htmlDivUlNoLi)
    }

    void testWithGoodHtml() {
        def html = """
        <div class='list'>
            <ul>
                <li>list 1</li>
                <li>list 2</li>
            </ul>
        </div>
        """    
        assertTrue verifyHtml(html)
    }    
}
相关问题