【发布时间】:2011-03-04 09:11:13
【问题描述】:
如何判断一个字符串是否包含 HTML 数据?用户通过网络界面提供输入,他很可能使用简单的文本或 HTML 格式。
【问题讨论】:
-
OP想用Java做,这怎么重复?
如何判断一个字符串是否包含 HTML 数据?用户通过网络界面提供输入,他很可能使用简单的文本或 HTML 格式。
【问题讨论】:
您可以使用正则表达式来搜索 HTML 标签。
【讨论】:
在你的backing bean中,你可以尝试找到html标签,如<b>或<i>等...
您可以使用正则表达式(慢)或尝试查找“”字符。这取决于您对用户是否使用 html 的确定程度。
请记住,用户可以写<asdf>。如果您想 100% 确定使用的 html 是有效的,您将需要使用某个库中的复杂 html 解析器(也许是 TidyHTML?)
【讨论】:
您只能通过正则表达式字符串获得帮助。它们可以帮助您找出潜在的 html 标签。然后,您可以比较内部以包含任何 html 关键字。如果找到,请发出警告,告诉您不要使用 HTML。或者,如果您觉得不合适,直接将其删除。
【讨论】:
如果您不希望用户在其输入中包含 HTML,则可以将所有“' (& 和 g 之间没有空格)
【讨论】:
我知道这是一个老问题,但我遇到了它并正在寻找更全面的东西,可以检测 HTML 实体之类的东西,并且会忽略 符号的其他用途。我想出了以下运行良好的类。
你可以在http://ideone.com/HakdHo现场玩它
我还通过一堆 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;
}
}
【讨论】:
我正在使用正则表达式:
[\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 元素,因为我发现一些网站不使用它。 (?!)因此,如果您更喜欢误报而不是误报,我鼓励这样做!
【讨论】:
下面将匹配任何标签。您还可以提取标签、属性和值
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));
}
}
【讨论】: