有没有一种从Java字符串中删除HTML的好方法?一个简单的正则表达式
replaceAll("\\<.*?>","")
会工作,但&
不会正确转换,两个尖括号之间的非HTML将被删除(即.*?
正则表达式将消失).
使用HTML解析器而不是正则表达式.使用Jsoup这很简单.
public static String html2text(String html) { return Jsoup.parse(html).text(); }
Jsoup还支持对可定制的白名单,如果你希望只允许例如这是非常有用的去除HTML标签,
和
.
除了XHTML自包含标记之外,RegEx匹配开放标记
领先的Java HTML解析器的优缺点是什么?
JSP/Servlet Web应用程序中的XSS预防
如果你正在为Android写作,你可以这样做......
android.text.Html.fromHtml(instruction).toString()
如果用户输入hey!
,您要显示hey!
还是hey!
?如果第一个,逃避少数,和html编码&符号(和可选的引号),你很好.对代码实施第二个选项的修改是:
replaceAll("\\<[^>]*>","")
但如果用户输入格式错误的内容,您将遇到问题
.
您还可以查看将解析"脏"html输入的JTidy,并且应该为您提供一种删除标记的方法,保留文本.
尝试剥离html的问题是浏览器具有非常宽松的解析器,比你能找到的任何库都宽松,所以即使你尽力剥离所有标签(使用上面的替换方法,DOM库或JTidy) ,您仍然需要确保编码任何剩余的HTML特殊字符,以确保您的输出安全.
另一种方法是使用 javax.swing.text.html.HTMLEditorKit来提取文本.
import java.io.*; import javax.swing.text.html.*; import javax.swing.text.html.parser.*; public class Html2Text extends HTMLEditorKit.ParserCallback { StringBuffer s; public Html2Text() { } public void parse(Reader in) throws IOException { s = new StringBuffer(); ParserDelegator delegator = new ParserDelegator(); // the third parameter is TRUE to ignore charset directive delegator.parse(in, this, Boolean.TRUE); } public void handleText(char[] text, int pos) { s.append(text); } public String getText() { return s.toString(); } public static void main(String[] args) { try { // the HTML to convert FileReader in = new FileReader("java-new.html"); Html2Text parser = new Html2Text(); parser.parse(in); in.close(); System.out.println(parser.getText()); } catch (Exception e) { e.printStackTrace(); } } }
ref:从文件中删除HTML标记以仅提取TEXT
我认为过滤html标签的最简单方法是:
private static final Pattern REMOVE_TAGS = Pattern.compile("<.+?>"); public static String removeTags(String string) { if (string == null || string.length() == 0) { return string; } Matcher m = REMOVE_TAGS.matcher(string); return m.replaceAll(""); }
使用Jericho也很简单,你可以保留一些格式(例如换行符和链接).
Source htmlSource = new Source(htmlText); Segment htmlSeg = new Segment(htmlSource, 0, htmlSource.length()); Renderer htmlRend = new Renderer(htmlSeg); System.out.println(htmlRend.toString());
接受的答案Jsoup.parse(html).text()
只有两个潜在的问题(使用JSoup 1.7.3):
它从文本中删除换行符
它将文本<script>
转换为
如果您使用它来防止XSS,这有点烦人.以下是使用JSoup和Apache StringEscapeUtils改进的解决方案的最佳镜头:
// breaks multi-level of escaping, preventing <script> to be rendered asTags | 热门标签RankList | 热门文章
- 1Stetho显示两个具有相同名称的列
- 2在C#中的父类上正确实现IDisposable
- 3Rails类型如何转换array_agg()函数的结果
- 4OpenLayers:如何检测地图视图是否已完全加载?
- 5如何在从url打开后清除活动中的意图数据?
- 6无法训练神经网络解决XOR映射
- 7如何在Camel中动态添加和启动路由?
- 8Threads和println()语句之间的关系
- 9如何向Android活动添加底部菜单
- 10使用rvest(R)进行网络抓取时停止使用网址
- 11如何使用webpack从node_modules加载静态CSS文件?
- 12从Google地图下载地图图块的网址是什么?
- 13TypeError - 无法隐式地将'int'对象转换为str
- 14反应本机StyleSheet属性和选项的列表
- 15如何在mysql中选择不同的列和
- 16C++结构中数组的初始化
- 17嵌套模块上的UnboundLocalError重新导入
- 18将项添加到NSSet以获取核心数据的一对多关系
- 19如何训练具有张量流的简单非线性回归模型?
- 20正则表达式:如何匹配多个值的确切长度?