⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htmlutil.java

📁 Jodd是一个开源的公用Java基础类库
💻 JAVA
字号:
package jodd.servlet;

import jodd.util.StringUtil;

/**
 * Html utils for working with tag's names and attributes.
 */
public class HtmlUtil {

	// ---------------------------------------------------------------- tag name

	/**
	 * Returns tag's name. Given string represents a HTML body of a tag,
	 * therefore it <b>must</b> start with '<'.
	 *
	 * @param tagBody tag's body
	 *
	 * @return tag's name, or <code>null</code> if tag not found
	 */
	public static String getTagName(String tagBody) {
		return getTagName(tagBody, 0);
	}

	/**
	 * Returns tag's name. Given string represents a HTML body and given starting index
	 * <b>must</b> be the index of tag's start (i.e. '<').
	 * <p>
	 *
	 * Names of ending tags will always start with '/' character.
	 *
	 * @param body   hmtl body
	 * @param i      index of tag's start
	 *
	 * @return tag's name, or <code>null</code> if tag not found
	 */
	public static String getTagName(String body, int i) {
		if (body == null) {
			return null;
		}
		if (body.charAt(i) != '<') {
			return null;		// no tag
		}
		int start = i + 1;		// skip '<'
		int len = body.length();
		boolean isEndTag = false;
		// skip all non-letters
		while (start < len) {
			char c = body.charAt(start);
			if (c == '>') {
				return null;	// tag end found => name not found
			}
			if (c == '/') {		// this is an end tag
				start++;
				isEndTag = true;
				continue;
			}
			if (Character.isWhitespace(c) == false) {
				break;
			}
			start++;
		}
		if (start == len) {
			return null;		// tag name not found
		}
		int end = start;
		// skip all letters
		while (end < len) {
			char c = body.charAt(end);
			if ((Character.isWhitespace(c) == true) || (c == '>')) {
				break;
			}
			end++;
		}
		if (end == len) {
			return null;		// tag end not found
		}

		String tagName = body.substring(start, end);
		if (isEndTag == true) {
			tagName = "/" + tagName;
		}
		return tagName;
	}



	// ---------------------------------------------------------------- tag attribute

	/**
	 * Returns value of the first founded attribute that matches given name.
	 * It is assumed that given string represents tag's body.
	 * Note: attribute <b>must</b> end with the <code>="</code> or <code>='</code>.
	 * Attribute name is not case sensitive.
	 *
	 * @param tagBody  tag body
	 * @param attrName attribute name
	 *
	 * @return attribute value or <code>null</code> if attribute not found
	 */
	public static String getAttribute(String tagBody, String attrName) {
		return getAttribute(tagBody, attrName, 0);
	}

	/**
	 * Returns value of the first founded attribute that matches given name.
	 * Given string may not be just a tag's body, however, start and end
	 * parameters must define tags body.
	 * Note: attribute <b>must</b> end with the <code>="</code> or <code>='</code>.
	 * Attribute name is not case sensitive.
	 *
	 * @param body     html body
	 * @param attrName attribute name
	 * @param start    index of tag's start
	 *
	 * @return attribute value or <code>null</code> if attribute not found
	 */
	public static String getAttribute(String body, String attrName, int start) {
		if (body == null) {
			return null;
		}
		char quote = '\"';
		int end = body.indexOf('>');
		if (end == -1) {
			return null;	// tag's end not found
		}
		int i = StringUtil.indexOfIgnoreCase(body, attrName + "=\"", start);
		if ((i == -1) || (i > end)) {
			i = StringUtil.indexOfIgnoreCase(body, attrName + "='", start);
			if ((i == -1) || (i > end)) {
				return null;
			}
			quote = '\'';
		}
		String value = null;
		i += attrName.length() + 2;
		int s = i;
		int j = -1;
		while (true) {
			j = body.indexOf(quote, s);
			if (j == -1) {
				break;		// closed quation not found
			}
			if (body.charAt(j - 1) == '\\') {
				s = j + 1;
				continue;
			} else {
				value = body.substring(i, j);
				break;
			}
		}
		return value;
	}

	// ---------------------------------------------------------------- add attribute & value


	/**
	 * Adds attribute and its value to a tag. Attribute is added to the end of
	 * the tag, just before closing '>'. If name is not specified, nothing will
	 * be added. If value is not specified, it will be set to an empty string.
	 *
	 * @param tagBody tag body
	 * @param name    attribute name
	 * @param value   attribute value
	 *
	 * @return tag string with added attribute and value
	 */
	public static String addAttribute(String tagBody, String name, String value) {
		return addAttribute(tagBody, name, value, 0);
	}

	/**
	 * Adds attribute and its value to a tag. Attribute is added to the end of
	 * the tag, just before closing '>'. If name is not specified, nothing will
	 * be added. If value is not specified, it will be set to an empty string.
	 *
	 * @param body   html body
	 * @param name   attribute name
	 * @param value  attribute value
	 * @param i      tag's offset in html body
	 *
	 * @return tag string with added attribute and value
	 */
	public static String addAttribute(String body, String name, String value, int i) {
		if (body == null) {
			return null;
		}
		if (name == null) {
			return body;
		}
		if (value == null) {
			value = "";
		}
		int end = body.indexOf('>', i);
		if (end == -1) {
			return body;
		}
		StringBuffer result = new StringBuffer(body.length());
		result.append(body.substring(i, end)).append(' ');
		result.append(name).append('=').append('"');
		//result.append(ServletUtil.encodeHtml(value)).append('"');
		result.append(HtmlEncoder.encode(value)).append('"');
		result.append(body.substring(end));
		return result.toString();
	}


	// ---------------------------------------------------------------- add attribute, no value


	/**
	 * Adds single attribute without value to a tag. Attribute is added to the
	 * end of the tag, just before closing '>'. If name is not specified, nothing
	 * will be added.
	 *
	 * @param tagBody tag body
	 * @param name    attribute name
	 *
	 * @return tag string with added attribute
	 */
	public static String addAttribute(String tagBody, String name) {
		return addAttribute(tagBody, name, 0);
	}

	/**
	 * Adds single attribute without value to a tag. Attribute is added to the
	 * end of the tag, just before closing '>'. If name is not specified, nothing
	 * will be added.
	 *
	 * @param body   html body
	 * @param name   attribute name
	 * @param i      tag's offset in html body
	 *
	 * @return tag string with added attribute
	 */
	public static String addAttribute(String body, String name, int i) {
		if (body == null) {
			return null;
		}
		if (name == null) {
			return body;
		}
		int end = body.indexOf('>', i);
		if (end == -1) {
			return body;
		}
		StringBuffer result = new StringBuffer(body.length());
		result.append(body.substring(i, end)).append(' ');
		result.append(name).append(body.substring(end));
		return result.toString();
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -