输入一段html代码,转换html标签的时候能不能指定几个不转其他全转。
下边是我转换标签的方法。
public static void main(String[] argv) {
String test = "
/**
*
* 基本功能:替换标记以正常显示
* <p>
*
* @param input
* @return String
*/
public static String replaceTag(String input) {
if (!hasSpecialChars(input)) {
return input;
}
StringBuffer filtered = new StringBuffer(input.length());
char c;
for (int i = 0; i <= input.length() - 1; i++) {
c = input.charAt(i);
switch (c) {
case '<':
filtered.append("<");
break;
case '>':
filtered.append(">");
break;
case '"':
filtered.append(""");
break;
case '&':
filtered.append("&");
break;
default:
filtered.append(c);
}
}
return (filtered.toString());
}
/**
*
* 基本功能:判断标记是否存在
* <p>
*
* @param input
* @return boolean
*/
public static boolean hasSpecialChars(String input) {
boolean flag = false;
if ((input != null) && (input.length() > 0)) {
char c;
for (int i = 0; i <= input.length() - 1; i++) {
c = input.charAt(i);
switch (c) {
case '>':
flag = true;
break;
case '<':
flag = true;
break;
case '"':
flag = true;
break;
case '&':
flag = true;
break;
}
}
}
return flag;
}
这样做所有的标签都转换了,能不能转换的时候判断下,如果是sapn,p,br标签就不转了呢?
我写过一个工具类,用来对文本分块的,其中涉及到切分 ... ,你可以参考,从实现方法上是类似的。
[code="java"]public enum HTMLSplitor {
Instance;
private final static char[] startTag = new char[] { '<', 'a' };
private final static char[] endTag = new char[] { '<', '/', 'a', '>' };
private int getTagOpenedLoc(String htmlText, int start) {
for (int i = start; i < htmlText.length(); i++) {
if (htmlText.charAt(i) == startTag[0])
return i;
}
return htmlText.length();
}
private int getCommonTagClosedLoc(String htmlText, int start) {
for (int i = start; i < htmlText.length(); i++) {
if (htmlText.charAt(i) == endTag[3])
return i;
}
return htmlText.length();
}
private int getLinkTagClosedLoc(String htmlText, int start) {
for (int i = start; i < htmlText.length() - 4; i++) {
if ((htmlText.charAt(i) == endTag[0])
&& (htmlText.charAt(i + 1) == endTag[1])
&& (htmlText.charAt(i + 2) == endTag[2])
&& (htmlText.charAt(i + 3) == endTag[3]))
return i + 3;
}
return htmlText.length();
}
/*
* Split the String to several Segment Each segment is a String which can be
* used for match
*/
public List<Segment> splitHTMLText(String htmlText) {
List<Segment> segList = new ArrayList<Segment>();
boolean tagOpened = false;
int start = 0;
int cursor = 0;
while (true) {
if (tagOpened) {
if (htmlText.charAt(cursor) == startTag[1]) {
// In the tag <a
// cursor = get
cursor = getLinkTagClosedLoc(htmlText, cursor);
} else {
// Just in the tag <
cursor = getCommonTagClosedLoc(htmlText, cursor);
}
if (cursor >= htmlText.length() - 1)
return segList;
cursor++;
start = cursor;
tagOpened = false;
} else {
cursor = getTagOpenedLoc(htmlText, start);
if (cursor > start + 1) {
Segment seg = new Segment(start, cursor - 1);
segList.add(seg);
}
if (cursor >= htmlText.length() - 1)
return segList;
cursor++;
tagOpened = true;
}
}
}
}[/code]
[quote]能不能转换的时候判断下,如果是sapn,p,br标签就不转了呢?[/quote]
可以,我写过类似程序,例如可以这样做:
如果遇到<标签,就判断紧接若干字符,按照你的需求,只需要判断接下来的几个字符是否是span, p, br(开始标签)或是/span, /p, /br(结束标签)就行了。
上面的算法也只需要扫描一次字符串,但是需要注意的问题时,遇到<向后扫描的时候需要判断是否有数组越界情况。