html标签转换问题

输入一段html代码,转换html标签的时候能不能指定几个不转其他全转。
下边是我转换标签的方法。
public static void main(String[] argv) {
String test = "

8888qq
ya9999ngqiu
";

System.out.println(replaceTag(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("&lt;");   
            break;   
        case '>':   
            filtered.append("&gt;");   
            break;   
        case '"':   
            filtered.append("&quot;");   
            break;   
        case '&':   
            filtered.append("&amp;");   
            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(结束标签)就行了。

上面的算法也只需要扫描一次字符串,但是需要注意的问题时,遇到<向后扫描的时候需要判断是否有数组越界情况。