正則表示式去除html標籤
阿新 • • 發佈:2019-02-01
大部分部落格網站的首頁文章的內容都是截取了文章的一部分,然後點選“檢視更多”才能看完整的文字。所以,擷取字串是必不可少的。
但是如果我們直接用 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 = "<[^>]+>"
- 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=\"https://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=\"https://img-blog.csdn.net/20140914222446977?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZzc5NDY4NjcxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast\" alt=\"\" />\n" +
- "\n" +
- "<img src=\"https://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=\"https://img-blog.csdn.net/20140914222659905?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZzc5NDY4NjcxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast\" alt=\"\" />\n" +
- "\n" +
- "<img src=\"https://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、最終效果如下