2015-05-04 34 views
0

我正在試圖用Scala正則表達式在網頁中查找imgsrc。 使用下面的代碼和模擬內容,我沒有得到任何匹配。我錯過了什麼?Scala正則表達式在網頁上查找img src

def imgSrc(content: String) = { 
    val src = ".*<img[\\w\\s]+src\\s*=\\s*(\"\\w+\")[\\w\\s]+/>.*".r 
    val formattedContent = content.replaceAll(lineSeparator, "") 

    (src findAllIn formattedContent).toList 
} 

測試用例:

"Method imgSrc" should "find src attributes of all img tags in mock web page" in { 
    val content = """<a href="#search" onclick="_gaq.push(['_trackPageview', '/search']); 
        return Manager.createHistoryAndLoad(true);"> 
        <img src="ajaxsolr/images/centralRepository_logo.png" alt="The Central Repository" /> 
        </a>""" 
    imgSrc(content) should contain("ajaxsolr/images/centralRepository_logo.png") 
} 

此外,它會是不錯的可以不刪除換行符匹配多輸入。我讀thisthis,但不能得到它的工作。

注意:這只是一個學習練習。我知道並普遍同意不應該使用正則表達式來解析HTML。

+0

你試試這個http://stackoverflow.com/ questions/18664997/how-can-i-use-regular-expression-to-grab-an-img-tag? – dk14

+0

我做了,並且與下面的@ dk14答案有相同的問題。 –

回答

3

這個工作對你輸入:

scala> def imgSrc(content: String) = { 
    | val src = """(?s)<img\s[^>]*?src\s*=\s*['\"]([^'\"]*?)['\"][^>]*?>""".r 
    | src findAllMatchIn content map (_.group(1)) toList 
    | } 
imgSrc: (content: String)List[String] 

scala> imgSrc(content) 
res13: List[String] = List(ajaxsolr/images/centralRepository_logo.png) 

但我會建議你使用一些普通的HTML解析器,像Jsoup:

val doc = Jsoup.parse(content); 
val img = doc.select("img").first(); 
val src = img.attr("src"); 
+0

這得到了整個圖像標籤,而不是我想要的src。我知道jsoup,這只是一個學習練習。 –

+0

謝謝,我已經接受並提出了您的答案。我必須查看'findAllMatchIn'方法。我能否從'findAllIn matchData'獲取組? –

+0

'src findAllMatchIn content'和'(src findAllIn content).matchData'返回相同的'Iterator [Match]',但第一個看起來更適合Scala語法 – dk14