如何查找字符串是否包含HTML数据?用户通过Web界面提供输入,很可能他可以使用简单文本或使用HTML格式。
答案 0 :(得分:17)
我知道这是一个老问题,但我遇到了它并且正在寻找更全面的东西,可以检测像HTML实体这样的东西,并且会忽略<的其他用途。和>符号。我想出了下面一个运作良好的课程。
直播我还通过一系列JUnit测试将其上传到GitHub。
package org.github;
/**
* Detect HTML markup in a string
* This will detect tags or entities
*
* @author dbennett455@gmail.com - David H. Bennett
*
*/
import java.util.regex.Pattern;
public class DetectHtml
{
// adapted from post by Phil Haack and modified to match better
public final static String tagStart=
"\\<\\w+((\\s+\\w+(\\s*\\=\\s*(?:\".*?\"|'.*?'|[^'\"\\>\\s]+))?)+\\s*|\\s*)\\>";
public final static String tagEnd=
"\\</\\w+\\>";
public final static String tagSelfClosing=
"\\<\\w+((\\s+\\w+(\\s*\\=\\s*(?:\".*?\"|'.*?'|[^'\"\\>\\s]+))?)+\\s*|\\s*)/\\>";
public final static String htmlEntity=
"&[a-zA-Z][a-zA-Z0-9]+;";
public final static Pattern htmlPattern=Pattern.compile(
"("+tagStart+".*"+tagEnd+")|("+tagSelfClosing+")|("+htmlEntity+")",
Pattern.DOTALL
);
/**
* Will return true if s contains HTML markup tags or entities.
*
* @param s String to test
* @return true if string contains HTML
*/
public static boolean isHtml(String s) {
boolean ret=false;
if (s != null) {
ret=htmlPattern.matcher(s).find();
}
return ret;
}
}
答案 1 :(得分:3)
您可以使用正则表达式搜索HTML标记。
答案 2 :(得分:3)
我正在使用正则表达式:
[\S\s]*\<html[\S\s]*\>[\S\s]*\<\/html[\S\s]*\>[\S\s]*
所以在JAVA看起来像:
text.matches("[\\S\\s]*\\<html[\\S\\s]*\>[\\S\\s]*\\<\\/html[\\S\\s]*\\>[\S\s]*");
它应该匹配任何包含某个“html”元素的正确(以及一些不正确的)XML文件。所以可能存在误报。
修改强>
由于我已发布,我已删除了html元素关闭的最后一部分,因为我发现一些网站不使用它。 (?!)所以万一,你更喜欢误报的误报,我鼓励这样做!
答案 3 :(得分:2)
在您的支持bean中,您可以尝试查找html标记,例如<b>
或<i>
等...
你可以使用正则表达式(慢)或只是尝试找到“&lt;&gt;”字符。这取决于用户使用html的确定程度。
请记住,用户可以写<asdf>
。如果你想100%确定使用的html是有效的,你需要使用某个库中的复杂html解析器(可能是TidyHTML?)
答案 4 :(得分:2)
如果您不希望用户在其输入中包含HTML,则可以替换所有“&lt;”与HTML实体等效的字符,'&amp; LT;”和所有'&gt;'与'&amp; GT;” (&amp;和g之间没有空格)
答案 5 :(得分:1)
下面将匹配任何标签。您还可以提取标签,属性和值
Pattern pattern = Pattern.compile("<(\\w+)( +.+)*>((.*))</\\1>");
Matcher matcher = pattern.matcher("<as testAttr='5'> TEST</as>");
if (matcher.find()) {
for (int i = 0; i < matcher.groupCount(); i++) {
System.out.println(i + ":" + matcher.group(i));
}
}
答案 6 :(得分:0)
您必须仅通过正则表达式字符串获得帮助。它们可以帮助您找到潜在的HTML标签。然后,您可以比较内部以包含任何html关键字。如果找到它,请提示不要使用HTML。或者,如果您不这么想,只需将其删除即可。