JAVA中Html标签转换的问题。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA中Html标签转换的问题。相关的知识,希望对你有一定的参考价值。

1、要求是只输出<body>和</body>之间的内容,怎么表示呢?
2、将<p></p>替换掉,用replace()么?怎么能在</p>时结束呢?
3、<br>是不是就temp = temp.replace("<br>","\n");?
4、如果是像<h1></h1>这种的,直接去掉么?
5、replace()和replaceAll()的区别是?

我写到这里之后自己变得很混乱。。。
while(input.hasNext())
String text=source.nextLine();
String body="<body>";
String endbody="</body>";
String temp;
if(temp.indexOf("<p>")!=-1)
temp = temp.replace("<p>", "");
System.out.print(temp);
初学者,谢谢。

用正则,我找个自己用的代码给你。
private static String rep="<[\\s]*?script[^>]*?>" +
"|<[\\s]*?\\/[\\s]*?script[\\s]*?>" +
"|<[\\s]*?div[^>]*?>" +
"|<[\\s]*?\\/[\\s]*?div[\\s]*?>"+
"|<[\\s]*?style[^>]*?>"+
"|<[\\s]*?\\/[\\s]*?style[\\s]*?>"+
"|<[\\s]*?form[^>]*?>"+
"|<[\\s]*?\\/[\\s]*?forum[\\s]*?>"+
"|<[\\s]*?input[^>]*?>"+
"|<[\\s]*?\\/[\\s]*?select[\\s]*?>"+
"|<[\\s]*?<marquee [^>]*?>"+
"|<[\\s]*?\\/[\\s]*?<marquee [\\s]*?>" +
"|<[\\s]*?ul[^>]*?>" +
"|<[\\s]*?\\/[\\s]*?ul[\\s]*?>" +
"|<[\\s]*?li[^>]*?>" +
"|<[\\s]*?\\/[\\s]*?li[\\s]*?>" +
"|<[\\s]*?div[^>]*?>" +
"|<[\\s]*?\\/[\\s]*?div[\\s]*?>" +
"|<[\\s]*?table[^>]*?>" +
"|<[\\s]*?\\/[\\s]*?table[\\s]*?>" +
"|<[\\s]*?tr[^>]*?>" +
"|<[\\s]*?\\/[\\s]*?tr[\\s]*?>" +
"|<[\\s]*?td[^>]*?>" +
"|<[\\s]*?\\/[\\s]*?td[\\s]*?>" +
"|<[\\s]*?th[^>]*?>" +
"|<[\\s]*?\\/[\\s]*?th[\\s]*?>";

/**
* 去掉危险的代码[div][style][form][input][script][ul][li][table][tr][td][th]
* @param content
* @return
*/
public static String removeDangerTag(String content)
Pattern p = null;
Matcher m = null;
p = Pattern.compile(rep,Pattern.CASE_INSENSITIVE);//去掉危险的html
m = p.matcher(content);
String temp = m.replaceAll("");
return temp;

//-----------按照你的要求,吧相应的p加入到正则匹配中
private static String rep="<[\\s]*?script[^>]*?>" +
"|<[\\s]*?\\/[\\s]*?script[\\s]*?>" +
"|<[\\s]*?div[^>]*?>" +
"|<[\\s]*?\\/[\\s]*?div[\\s]*?>"+
"|<[\\s]*?style[^>]*?>"+
"|<[\\s]*?\\/[\\s]*?style[\\s]*?>"+
"|<[\\s]*?form[^>]*?>"+
"|<[\\s]*?\\/[\\s]*?forum[\\s]*?>"+
"|<[\\s]*?input[^>]*?>"+
"|<[\\s]*?\\/[\\s]*?select[\\s]*?>"+
"|<[\\s]*?<marquee [^>]*?>"+
"|<[\\s]*?\\/[\\s]*?<marquee [\\s]*?>" +
"|<[\\s]*?ul[^>]*?>" +
"|<[\\s]*?\\/[\\s]*?ul[\\s]*?>" +
"|<[\\s]*?li[^>]*?>" +
"|<[\\s]*?\\/[\\s]*?li[\\s]*?>" +
"|<[\\s]*?div[^>]*?>" +
"|<[\\s]*?\\/[\\s]*?div[\\s]*?>" +
"|<[\\s]*?table[^>]*?>" +
"|<[\\s]*?\\/[\\s]*?table[\\s]*?>" +
"|<[\\s]*?tr[^>]*?>" +
"|<[\\s]*?\\/[\\s]*?tr[\\s]*?>" +
"|<[\\s]*?td[^>]*?>" +
"|<[\\s]*?\\/[\\s]*?td[\\s]*?>" +
"|<[\\s]*?p[^>]*?>" + //这里加入了p标签
"|<[\\s]*?\\/[\\s]*?p[\\s]*?>" +
"|<[\\s]*?th[^>]*?>" +
"|<[\\s]*?\\/[\\s]*?th[\\s]*?>";
参考技术A 1、replace标签替换.
2、正则处理。
Today is Sunday.<br>Tomorrow will be Monday.
可以replace<br>为"\n"
参考技术B String s="<body><p>asdsadsadasda</p></body>";
System.out.println(s.replace("<p>", "").replace("</p>", ""));
替换之前不需要判断。

replace和replaceAll
都是全部替换。区别是replaceAll支持正则表达式
如s.replaceAll("\\d","");将s字符串的所有数字全部去掉
参考技术C 用java里面的正则表达式来匹配标签。
比较复杂了,自己可以研究一下。
参考技术D 你题目什么意思?不懂啊?说明白?是说用java输出html代码?还是什么意思?追问

就是比如说有一个html文件,
是这样的,
Today is Sunday.Tomorrow will be Monday.
然后让你在java里新建一个output file,
输出的格式应该是
Today is Sunday.
Tomorrow will be Monday.
应该怎么写java程序?用户输入的文件中,遇到这样的标签,就执行这样的代码?

追答

你是要写html解析器啊?这个有点麻烦,我就不管了。

如何在Java中删除HTML标签[重复]

【中文标题】如何在Java中删除HTML标签[重复]【英文标题】:How to remove HTML tag in Java [duplicate] 【发布时间】:2010-12-14 12:48:24 【问题描述】:

有没有可以完全去除HTML标签的正则表达式? 顺便说一句,我正在使用 Java。

【问题讨论】:

在搜索框中输入您的标题,我得到以下信息:***.com/search?q=How+to+remove+HTML+tag+in+Java ...您在发布问题时没有得到相同的结果吗? 我没有发现重复项。这些问题关心从 HTML 中提取文本:***.com/questions/240546/…***.com/questions/832620/stripping-html-tags-in-java 【参考方案1】:

没有。正则表达式不能根据定义解析 HTML。

您可以对s/&lt;[^&gt;]*\&gt;// 使用正则表达式或类似的简单方法,但这将是不够的,尤其是如果您有兴趣删除标签的内容。

正如另一位发帖者所说,使用实际的 HTML 解析器。

【讨论】:

【参考方案2】:

您不需要任何 HTML 解析器。下面的代码删除了所有的 HTML cmets:

htmlString = htmlString.replaceAll("(?s)&lt;!--.*?--&gt;", "");

【讨论】:

【参考方案3】:

JSoup 是一个用于 HTML 操作的 java 库。查看clean() 方法和WhiteList 对象。易于使用的解决方案!

【讨论】:

哇,先生,真的让我很开心,我喜欢这样,是的! Markdownj、Markdown4J、htmlCleaner .. 所有这些都是 ***** 抱歉.. JSoup 是唯一一个你真正实现这一目标的地方:String plain = new HtmlToPlainText().getPlainText(Jsoup.parse( html)); 更短的代码是String plaintext = Jsoup.parse(html).text(); @jrarama - 一点也不。 Jsoup.parse(html).text() 删除所有标签和空格,只留下一长行文本,而 new HtmlToPlainText().getPlainText(Jsoup.parse(html)) 以简单的方式格式化文本,保留换行符、段落、项目符号等。 @isapir: HtmlToPlainText 不包含在mvnrepository.com/artifact/org.jsoup/jsoup/1.11.3 那是因为HtmlToPlainText就是一个例子,见github.com/jhy/jsoup/blob/master/src/main/java/org/jsoup/…【参考方案4】:

你可以使用这个简单的代码来删除所有的html标签...

htmlString.replaceAll("\\<.*?\\>", ""))

【讨论】:

这只会删除开始标签,而不处理结束标签。 我永远不会独自完成这样的工作 - 将 html 解析为纯文本确实是一项艰巨的工作...... 它对我有用,但可能取决于标签、cmets、脚本等的复杂性。因此,对于复杂的情况,也许 html 库应该更好。【参考方案5】:

或者,如果您的意图是显示用户控制的输入返回给客户端,那么您也可以将所有&amp;lt; 替换为&amp;lt; 并将所有&amp;gt; 替换为&amp;gt; .这样,客户端的应用程序(网络浏览器)就不会按原样解释 HTML。

如果您使用 JSP 作为视图技术,那么您可以为此使用 JSTL 的c:out。默认情况下,它将转义所有 HTML 实体。比如

<c:out value="<script>alert('XSS');</script>" />

不会显示警报,而是按原样显示实际字符串。

【讨论】:

【参考方案6】:

如果你只需要删除标签,那么你可以使用这个正则表达式:

content = content.replaceAll("<[^>]+>", "");

它只会删除标签,但不会删除其他 HTML 内容。对于更复杂的事情,您应该使用解析器。

编辑:为避免 HTML cmets 出现问题,您可以执行以下操作:

content = content.replaceAll("<!--.*?-->", "").replaceAll("<[^>]+>", "");

【讨论】:

由于您不使用任何肉类字符 .^$,因此可以省略 s- 和 m 标志。 如果 HTML 包含嵌入了 '' 字符的 XML cmets,此正则表达式可能会导致损坏。【参考方案7】:

您应该改用 HTML 解析器。我喜欢htmlCleaner,因为它给了我一个漂亮的 HTML 打印版本。

使用 htmlCleaner 你可以做到:

TagNode root = htmlCleaner.clean( stream );
Object[] found = root.evaluateXPath( "//div[id='something']" );
if( found.length > 0 && found instanceof TagNode ) 
    ((TagNode)found[0]).removeFromTree();

【讨论】:

感谢您指向 htmlCleaner :) 我们是否需要获取任何库才能使用上面的代码?和 root.evaluateXPath("//div[id='something']");在这个“某事”中可能是任何身份仪式吗?请告诉我。谢谢

以上是关于JAVA中Html标签转换的问题。的主要内容,如果未能解决你的问题,请参考以下文章

将javascript中的html转换为HTML标签

使用 HTML5 视频标签播放视频

java正则表达式过滤html标签(转)

为啥我的 php 标签被转换为 html 注释?

如何将带有html标签的一列文本转换为excel中vba中的格式化文本

如何在谷歌应用脚​​本中将段落 html 字符串转换为没有 html 标签的纯文本?