Java 将换行符替换为<;br>;在子元素内部使用Jsoup
我在替换所有Java 将换行符替换为<;br>;在子元素内部使用Jsoup,java,html,jsoup,Java,Html,Jsoup,我在替换所有中的换行符时遇到问题; String body = "<p>This is the output:</p>\n<pre class=\"lang-xml prettyprint prettyprinted\">\n<code><span class=\"dec\"><!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://
中的换行符时遇到问题;
String body = "<p>This is the output:</p>\n<pre class=\"lang-xml prettyprint prettyprinted\">\n<code><span class=\"dec\"><!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\"></span><span class=\"pln\">\n</span><span class=\"tag\"><HTML></span><span class=\"pln\">\n </span><span class=\"tag\"><HEAD></span><span class=\"pln\">\n </span><span class=\"tag\"><META</span><span class=\"pln\"> </span><span class=\"atn\">http-equiv</span><span class=\"pun\">=</span><span class=\"atv\">\"Content-Type\"</span><span class=\"pln\"> </span><span class=\"atn\">content</span><span class=\"pun\">=</span><span class=\"atv\">\"text/html; charset=iso-8859-1\"</span><span class=\"tag\">></span><span class=\"pln\">\n </span><span class=\"tag\"><TITLE></span><span class=\"pln\">GeteBayOfficialTime</span><span class=\"tag\"></TITLE></span><span class=\"pln\">\n </span><span class=\"tag\"></HEAD></span><span class=\"pln\">\n </span><span class=\"tag\"><BODY></span><span class=\"pln\">\n\n* About to connect() to api.ebay.com port 443 (#0)\n* Trying 66.135.211.100... * Timeout\n* Trying 66.135.211.140... * Timeout\n* Trying 66.211.179.150... * Timeout\n* Trying 66.211.179.180... * Timeout\n* Trying 66.135.211.101... * Timeout\n* Trying 66.211.179.148... * Timeout\n* connect() timed out!\n* Closing connection #0\n</span><span class=\"tag\"><P></span><span class=\"pln\">Error sending request</span></code></pre>";
log.info("printing before creating a Jsoup Doc "+ body);
Document bodyDom = Jsoup.parse(body);
log.info("printing after creating a Jsoup Doc "+ bodyDom.html());
Elements preTags = bodyDom.getElementsByTag("pre");
for (Element pre : preTags) {
pre.html(pre.html().replaceAll("(\r\n|\n)", "<br />"));
log.info("Pre element with linebreaks replaced -" + pre);
}
body = bodyDom.html();
log.info(“创建Jsoup单据前打印”+正文);
documentbodydom=Jsoup.parse(body);
log.info(“创建Jsoup文档后打印”+bodyDom.html());
Elements preTags=bodyDom.getElementsByTag(“pre”);
适用于(元素前:预标记){
pre.html(pre.html().replaceAll(“(\r\n |\n)”,“
”);
日志信息(“替换换行符的前置元素-”+前置元素);
}
body=bodyDom.html();
这是日志,似乎html源代码在解析Jsoup文档后丢失了换行符:
Jsoup.parse("\nText\nNex").html();
**2013-12-10 10:14:59信息格式测试:166**-在创建Jsoup文档之前打印这是输出:
!DOCTYPE HTML PUBLIC“-//W3C//DTD HTML4.01//EN”http://www.w3.org/TR/html4/loose.dtd"
HTML
头
META http equiv=“Content Type”Content=“text/html;字符集=iso-8859-1“
TITLEGeteBayOfficialTime/TITLE
/头
身体
*即将连接()到api.ebay.com端口443(#0)
*正在尝试66.135.211.100…*超时
*正在尝试66.135.211.140…*超时
*正在尝试66.211.179.150…*超时
*正在尝试66.211.179.180…*超时
*正在尝试66.135.211.101…*超时
*正在尝试66.211.179.148…*超时
*connect()超时!
*正在关闭连接#0
发送或发送请求
**2013-12-10 10:14:59信息格式测试:168**-创建Jsoup文档后打印
这是输出:
!DOCTYPE HTML PUBLIC“-//W3C//DTD HTML4.01//EN”http://www.w3.org/TR/html4/loose.dtd“HTML HEAD META http equiv=“Content Type”Content=“text/HTML;charset=iso-8859-1“TITLEGeteBayOfficialTime/TITLE/HEAD BODY*即将连接()到api.ebay.com端口443(#0)*尝试66.135.211.100…*超时*尝试66.135.211.140…*超时*尝试66.211.179.150…*超时*尝试66.211.179.180…*超时*尝试66.135.211.101…*超时*尝试66.211.179.148…*超时*连接()超时!*正在关闭连接#0或发送请求
2013-12-10 10:14:59信息格式测试:174-替换换行符的前置元素-!DOCTYPE HTML PUBLIC“-//W3C//DTD HTML 4.01//EN”http://www.w3.org/TR/html4/loose.dtd“HTML HEAD META http equiv=“Content Type”Content=“text/HTML;charset=iso-8859-1“TITLEGeteBayOfficialTime/TITLE/HEAD BODY*即将连接()到api.ebay.com端口443(#0)*尝试66.135.211.100…*超时*尝试66.135.211.140…*超时*尝试66.211.179.150…*超时*尝试66.211.179.180…*超时*尝试66.135.211.101…*超时*尝试66.211.179.148…*超时*连接()超时!*正在关闭连接#0或发送请求
不确定出了什么问题。这是另一个html源代码-
“\n响应:\n某些文本\n\ndsjkhskjdh sdjhasjkdas\n”
正确转换为-响应:
某些文本
text nex
不确定为什么第一个示例没有!!问题是当您尝试这样做时:
Document bodyDom = Jsoup.parse(body.replaceAll("(\\r\\n|\\n)", "<br />"));
你会得到:
Pattern preP = Pattern.compile("<pre.*?>.+?</pre>", Pattern.DOTALL
| Pattern.CASE_INSENSITIVE);
Matcher m = preP.matcher(body);
while (m.find()) {
String toReplace = m.group();
String replaced = toReplace.replaceAll("(\r\n|\n)", "<br />");
body = body.replace(toReplace, replaced);
}
从中,您可以执行以下操作:
Document.OutputSettings outputSettings = new Document.OutputSettings()
.prettyPrint(false);
body = Jsoup.clean(body, "", Whitelist.relaxed(), outputSettings);
,Pattern.DOTALL
|模式(不区分大小写);
匹配器m=准备匹配器(主体);
while(m.find()){
字符串toReplace=m.group();
字符串replaced=toReplace.replaceAll(“(\r\n |\n)”,“”; 车身=车身.更换(更换,更换); }
+*
是一个贪婪的限定符,它与/pre
的第一次出现相匹配,您可以尝试使用正则表达式,但这是不可能的,请参阅以获得更好的解释。我建议您使用下一个选项
您可以看到正则表达式的示例
clean
解析前的字符串
从中,您可以使用:
以及之后(如原始代码中所示):
pre.html(pre.html().replaceAll(“(\r\n |\n)”,“
”);
prettyPrint
选项使clean
方法退出换行符,然后解析器正确处理它
干杯由于您的HTML示例不是一个完整的页面,您可能会更幸运地使用它。谢谢,我们会尝试一下并让您知道。不幸的是,这没有帮助,它仍然会删除所有换行符。您好,谢谢您的回答。但是,这并没有帮助,因为-如果您查看代码,我希望仅在Pre元素中用
替换换行符。在解析前用Jsoup替换它们将无法达到目的,因为在解析Pre元素之前,我将丢失所有换行符。您好,我添加了更多代码来处理您的案例,在我的本地测试中,它是有效的,请告诉我是否我错了。谢谢你的努力。快速提问,这是否考虑了具有任何属性或根本没有属性的pre元素?我现在就来试试。谢谢你的回答,正则表达式解决方案很有效。我现在唯一的问题是,这是否匹配任何具有任何属性或没有属性的pre元素?这也会处理嵌套的pre元素吗?嗨,Eswar,正则表达式的
*?
部分带有标记,使其匹配任意数量的属性(并且没有属性)。我现在正在用嵌套的pre的进行尝试,但它不起作用,我将用正确的版本更新mi答案。另一个大问题是不平衡的pre
,regex只匹配平衡的。
Pattern preP = Pattern.compile("<pre.*?>.+?</pre>", Pattern.DOTALL
| Pattern.CASE_INSENSITIVE);
Matcher m = preP.matcher(body);
while (m.find()) {
String toReplace = m.group();
String replaced = toReplace.replaceAll("(\r\n|\n)", "<br />");
body = body.replace(toReplace, replaced);
}
Document.OutputSettings outputSettings = new Document.OutputSettings()
.prettyPrint(false);
body = Jsoup.clean(body, "", Whitelist.relaxed(), outputSettings);
pre.html(pre.html().replaceAll("(\r\n|\n)", "<br />"));