我有一个包含HTML的Java String变量,我希望用其他名称替换PNG图像的所有名称。
示例输入HTML
<html>
<head>
<link rel="stylesheet" media="screen" href="style.css"/>
</head>
<body>
<img href="test1.png" />
<img href="test2.png" />
</body>
</html>
典型的输出HTML应为
<html>
<head>
<link rel="stylesheet" media="screen" href="style.css"/>
</head>
<body>
<img href="C:\foo\bar\test1.png" />
<img href="C:\foo\bar\test2.png" />
</body>
</html>
目前,我有这个Java代码,它通过将图像作为资源加载来为我提供新名称。 但是我找不到好的正则表达式来选择所有(并且只有)图像名称(带扩展但没有引号),有人可以帮我吗?
Pattern imagePattern = Pattern.compile(" TODO ");
Matcher imageMatcher = imagePattern.matcher(taskHTML);
while (imageMatcher.find())
{
String oldName = imageMatcher.group(1);
String newName = "" + getClass().getResource("/images/" + imageMatcher.group(1));
taskHTML.replace(oldName, newName);
}
匹配器应列出以下元素:
[test1.png, test2.png]
答案 0 :(得分:1)
与其他人提到的一样,我建议你使用像JSoup这样的HTML解析器。
<强>用法:强>
import org.jsoup.nodes.*;
import org.jsoup.select.Elements;
import org.jsoup.Jsoup;
public class Parse {
public static void main(String[] args) {
String webPage = "<img href=\"test1.png\" /><img href=\"test2.png\" />"; //your HTML
Document doc = Jsoup.parse(webPage);
Elements imgLinks = doc.select("img[href]"); //grabs all imgLinks
//for every <img> link
for(Element link : imgLinks){
String imageName = link.attr("href"); //grab current href (your image name)
link.attr("href", "C:\\foo\\bar\\" + imageName); //replace current href with the dir + imageName
}
System.out.println(doc.html()); //print modified HTML
}
}
<强>输出:强>
<html>
<head>
<link rel="stylesheet" media="screen" href="style.css">
</head>
<body>
<img href="C:\foo\bar\test1.png">
<img href="C:\foo\bar\test2.png">
</body>
</html>
如果您有要解析的本地HTML文件,则需要将上面的doc
替换为:
File in = new File(input);
Document doc = JSoup.parse(in, null);
或者,如果您想直接连接到某个页面,可以将其替换为:
Document doc = Jsoup.connect("http://stackoverflow.com/").get();
注意:您需要将JSoup添加到构建路径
答案 1 :(得分:0)
试试这个
str = str.replaceAll("href=\"(.*?)\"", "href=\"" + dir.replace("\\", "\\\\") + "$1\"");
答案 2 :(得分:0)
是否需要修改HTML内容,请考虑使用XSLT而不是REGEXP。
答案 3 :(得分:0)
我最终使用了以下正则表达式:
Pattern.compile("\\\"(.+\\.png)\\\"");
通过获取每个匹配的第二个元素(第一个是带引号的字符串)来访问引号之间的匹配:
matcher.group(1);