我遇到了Jsoup解析器的困难。如何判断给定字符串是否为有效的HTML代码?
String input = "Your vote was successfully added."
boolean isValid = Jsoup.isValid(input);
// isValid = true
isValid标志为true,因为Jsoup首先使用HtmlTreeBuilder:如果没有html,head或body标签丢失,它会自行添加它们。然后它使用Cleaner类并根据给定的白名单进行检查。
有没有简单的方法可以检查字符串是否是有效的HTML而没有Jsoup尝试将其设为HTML?
我的例子是AJAX响应,它是“text / html”内容类型。然后它转到解析器,Jsoup添加了这个标签,结果,响应没有正确显示。
感谢您的帮助。
答案 0 :(得分:5)
首先,Reuben提出的解决方案没有按预期工作。必须使用Pattern.DOTALL标志编译模式。输入HTML可能有(也可能会)新的线路标志等。
所以它应该是这样的:
Pattern htmlPattern = Pattern.compile(".*\\<[^>]+>.*", Pattern.DOTALL);
boolean isHTML = htmlPattern.matcher(input).matches();
我也认为这种模式不仅应该找到HTML标签。下一个:不是唯一有效的选项。也可能有属性,即。这也必须处理。
我选择修改Jsoup源代码。如果HTMLTreeBuilder(实际上是 BeforeHtml )尝试添加 <html>
元素,我会抛出ParseException,然后我确定输入文件不是有效的HTML文件。
答案 1 :(得分:2)
使用正则表达式检查String
是否包含HTML
boolean isHTML = input.matches(".*\\<[^>]+>.*");
如果您的String
包含HTML
值,则会返回true
String input = "<html><body></body></html>" ;
但是此代码String input = "Hello World <>";
将返回false