大部分博客网站的首页文章的内容都是截取了文章的一部分,然后点击“查看更多”才能看完整的文字。所以,截取字符串是必不可少的。
但是如果我们直接用 substring 截取,会出现很多问题。比如样式不会改变,加粗的,文字颜色都不会去掉。还有就是一个 html标签如<strong></strong>可能会被截成两段,导致后面的文字全部加粗之类的。这种情况绝不允许。
像下图的,首页文章列表中 部分文章颜色全部变红,截取不正当导致。
本文将介绍如何去除文章的 html 标签。
这里我们需要自定义标签
1、在WEB-INF 下新建一个 myTag.dtd 文件
注意:
<short-name> 和 <uri> 可以随便填
<tag>标签内的 <name> 和下面的类名一致,<tag-class>是类的地址,<body-content> 这里就填 scriptless好了,意思是标签体内可以放文本,jsp标签和其他任意标签
2、在对应位置新建 HtmlFilterTag.java
注意:
大家也可以按照自己的需求,修改上面的代码
3、在 jsp 里调用,以下是部分 jsp 代码
注意:
一定要引入 dtd 文件,注意你的路径,prefix 填你的标签前缀,比如我填的是 lyz,下面调用的话,前缀保持正确即可
4、最终效果如下
本文地址:https://liuyanzhao.com/6065.html
但是如果我们直接用 substring 截取,会出现很多问题。比如样式不会改变,加粗的,文字颜色都不会去掉。还有就是一个 html标签如<strong></strong>可能会被截成两段,导致后面的文字全部加粗之类的。这种情况绝不允许。
像下图的,首页文章列表中 部分文章颜色全部变红,截取不正当导致。
本文将介绍如何去除文章的 html 标签。
Java 实现
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- public class Demo {
- private static final String regEx_script = "<script[^>]*?>[\\s\\S]*?<\\/script>"; // 定义script的正则表达式
- private static final String regEx_style = "<style[^>]*?>[\\s\\S]*?<\\/style>"; // 定义style的正则表达式
- private static final String regEx_html = "<[^>]+>"; // 定义HTML标签的正则表达式
- private static final String regEx_space = "\\s*|\t|\r|\n";//定义空格回车换行符
- /**
- * @param htmlStr
- * @return
- * 删除Html标签
- */
- public static String delHTMLTag(String htmlStr) {
- Pattern p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
- Matcher m_script = p_script.matcher(htmlStr);
- htmlStr = m_script.replaceAll(""); // 过滤script标签
- Pattern p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);
- Matcher m_style = p_style.matcher(htmlStr);
- htmlStr = m_style.replaceAll(""); // 过滤style标签
- Pattern p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
- Matcher m_html = p_html.matcher(htmlStr);
- htmlStr = m_html.replaceAll(""); // 过滤html标签
- Pattern p_space = Pattern.compile(regEx_space, Pattern.CASE_INSENSITIVE);
- Matcher m_space = p_space.matcher(htmlStr);
- htmlStr = m_space.replaceAll(""); // 过滤空格回车标签
- return htmlStr.trim(); // 返回文本字符串
- }
- public static String getTextFromHtml(String htmlStr){
- htmlStr = delHTMLTag(htmlStr);
- htmlStr = htmlStr.replaceAll(" ", "");
- htmlStr = htmlStr.substring(0,100);
- return htmlStr;
- }
- public static void main(String[] args) {
- String str = "ubuntu 安装 phpmyadmin 两种 (两者选一):\n" +
- "<h4>1: apt-get 安装 然后使用 已有的虚拟主机目录建立软连接</h4>\n" +
- "<div class=\"dp-highlighter\">\n" +
- "<ol class=\"dp-xml\" start=\"1\">\n" +
- " \t<li class=\"alt\">sudo apt-get install phpmyadmin</li>\n" +
- " \t<li class=\"\">sudo ln-s /usr/share/phpmyadmin/ /var/www/pma</li>\n" +
- "</ol>\n" +
- "</div>\n" +
- "<h4>2:手动上传</h4>\n" +
- "网上下载 phpmyadmin软件包,使用 filezilla 上传到 /var/www/pma (pma自己创建)\n" +
- "\n" +
- "使用 ip/pma 查看 phpmyadmin\n" +
- "\n" +
- "其实 还可以 考虑给phpmyadmin 配置虚拟主机\n" +
- "\n" +
- "接下来 配置MySQL的 remote access\n" +
- "\n" +
- "默认下 mysql只能是本机访问的 但是 如果我通过ip 远程 访问方式 就是 remote access 比如 我在其他机器上要使用navicate 访问 也属于 remote access\n" +
- "\n" +
- "但是 ubuntu中的mysql 默认是不允许的 所以要修改mysql的配置\n" +
- "\n" +
- "sudo vim /etc/mysql/my.cnf #修改 bind-address 白名单 取消掉\n" +
- "\n" +
- "<img src=\"http://img.blog.csdn.net/20140914221520765?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZzc5NDY4NjcxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast\" alt=\"\" />\n" +
- "<h4></h4>\n" +
- "<h4>进入phpmyadmin</h4>\n" +
- "查看 用户 添加一个用户 可以 用 公网的ip 访问:\n" +
- "\n" +
- "<img src=\"http://img.blog.csdn.net/20140914222446977?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZzc5NDY4NjcxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast\" alt=\"\" />\n" +
- "\n" +
- "<img src=\"http://img.blog.csdn.net/20140914222456821?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZzc5NDY4NjcxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast\" alt=\"\" />\n" +
- "<h4>重启msyql</h4>\n" +
- "<div class=\"dp-highlighter\">\n" +
- "<ol class=\"dp-xml\" start=\"1\">\n" +
- " \t<li class=\"alt\">sudo service mysql restart</li>\n" +
- "</ol>\n" +
- "</div>\n" +
- "使用navicate测试远程登录:\n" +
- "\n" +
- "<img src=\"http://img.blog.csdn.net/20140914222659905?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZzc5NDY4NjcxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast\" alt=\"\" />\n" +
- "\n" +
- "<img src=\"http://img.blog.csdn.net/20140914222803896?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZzc5NDY4NjcxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast\" alt=\"\" />\n" +
- "\n" +
- "以上 远程登录 已经 完成\n" +
- "\n" +
- " \n" +
- "\n" +
- "更多文章\n" +
- "\n" +
- "<a href=\"http://liuyanzhao.com/2009.html\" target=\"_blank\" rel=\"noopener noreferrer\">ubuntu14.04 下 mysql 存储目录迁移</a>\n" +
- "\n" +
- "<a href=\"http://liuyanzhao.com/1978.html\" target=\"_blank\" rel=\"noopener noreferrer\">ubuntu14.04下配置apache虚拟主机</a>\n" +
- "\n" +
- "<a href=\"http://liuyanzhao.com/2447.html\" target=\"_blank\" rel=\"noopener noreferrer\">ubuntu14.04 安装phpmyadmin 和配置</a>\n" +
- "\n" +
- " \n" +
- "\n" +
- " \n" +
- "\n" +
- "本文地址:<a href=\"http://liuyanzhao.com/2447.html\" target=\"_blank\" rel=\"noopener noreferrer\">http://liuyanzhao.com/2447.html</a>\n" +
- "\n" +
- "转载请注明\n" +
- "\n" +
- " ";
- System.out.println(getTextFromHtml(str));
- }
- }
JSP 实现
这里我们需要自定义标签
1、在WEB-INF 下新建一个 myTag.dtd 文件
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE taglib
- PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
- "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
- <taglib>
- <tlib-version>1.0</tlib-version><!-- 代表标签库的版本号 -->
- <jsp-version>1.2</jsp-version><!-- 代表jsp的版本 -->
- <short-name>SimpleTag</short-name><!-- 你的标签库的简称 -->
- <uri>http://liuyanzhao.com</uri><!-- 你标签库的引用uri -->
- <tag>
- <name>htmlFilter</name>
- <tag-class>com.liuyanzhao.blog.util.others.HtmlFilterTag</tag-class>
- <body-content>scriptless</body-content>
- </tag>
- </taglib>
注意:
<short-name> 和 <uri> 可以随便填
<tag>标签内的 <name> 和下面的类名一致,<tag-class>是类的地址,<body-content> 这里就填 scriptless好了,意思是标签体内可以放文本,jsp标签和其他任意标签
2、在对应位置新建 HtmlFilterTag.java
- package com.liuyanzhao.blog.util.others;
- /**
- * Created by 言曌 on 2017/8/26.
- */
- import java.io.IOException;
- import java.io.StringWriter;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.PageContext;
- import javax.servlet.jsp.tagext.JspFragment;
- import javax.servlet.jsp.tagext.SimpleTagSupport;
- public class HtmlFilterTag extends SimpleTagSupport {
- private static final int subLength = 200; //截取字符串长度
- private static final String regEx_script = "<script[^>]*?>[\\s\\S]*?<\\/script>"; // 定义script的正则表达式
- private static final String regEx_style = "<style[^>]*?>[\\s\\S]*?<\\/style>"; // 定义style的正则表达式
- private static final String regEx_html = "<[^>]+>"; // 定义HTML标签的正则表达式
- private static final String regEx_space = "\\s*|\t|\r|\n";//定义空格回车换行符
- public static String filter(String htmlStr) {
- Pattern p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
- Matcher m_script = p_script.matcher(htmlStr);
- htmlStr = m_script.replaceAll(""); // 过滤script标签
- Pattern p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);
- Matcher m_style = p_style.matcher(htmlStr);
- htmlStr = m_style.replaceAll(""); // 过滤style标签
- Pattern p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
- Matcher m_html = p_html.matcher(htmlStr);
- htmlStr = m_html.replaceAll(""); // 过滤html标签
- Pattern p_space = Pattern.compile(regEx_space, Pattern.CASE_INSENSITIVE);
- Matcher m_space = p_space.matcher(htmlStr);
- htmlStr = m_space.replaceAll(""); // 过滤空格回车标签
- return htmlStr.trim(); // 返回文本字符串
- }
- @Override
- public void doTag() throws JspException, IOException {
- StringWriter sw = new StringWriter();
- JspFragment jf = this.getJspBody();
- jf.invoke(sw);
- String content = sw.getBuffer().toString();
- content = filter(content);
- content = content.replaceAll(" ", "");
- int contentLength =content.length();
- if(contentLength>subLength) {
- content = content.substring(0,subLength);
- } else {
- content = content.substring(0,contentLength);
- }
- ((PageContext) this.getJspContext()).getOut().write(content);
- }
- }
注意:
大家也可以按照自己的需求,修改上面的代码
3、在 jsp 里调用,以下是部分 jsp 代码
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <%@ taglib uri="/WEB-INF/myTag.dtd" prefix="lyz"%>
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="utf-8">
- </head>
- <body>
- <lyz:htmlFilter> ${article.content} </lyz:htmlFilter>
- </body>
- </html>
注意:
一定要引入 dtd 文件,注意你的路径,prefix 填你的标签前缀,比如我填的是 lyz,下面调用的话,前缀保持正确即可
4、最终效果如下
本文地址:https://liuyanzhao.com/6065.html
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏