我正在尝试使用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")
}
另外,如果能够在不删除换行符的情况下匹配多行输入,那就太好了。我读了这本和这本,但没能让它发挥作用。
注意:这只是一个学习练习。我知道并且普遍同意不应该使用正则表达式来解析HTML。
这对您的输入有效:
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");