1. 程式人生 > >正則表示式去除html標籤

正則表示式去除html標籤

大部分部落格網站的首頁文章的內容都是截取了文章的一部分,然後點選“檢視更多”才能看完整的文字。所以,擷取字串是必不可少的。

但是如果我們直接用 substring 擷取,會出現很多問題。比如樣式不會改變,加粗的,文字顏色都不會去掉。還有就是一個 html標籤如<strong></strong>可能會被截成兩段,導致後面的文字全部加粗之類的。這種情況絕不允許。

像下圖的,首頁文章列表中 部分文章顏色全部變紅,擷取不正當導致。


本文將介紹如何去除文章的 html 標籤。

Java 實現

  1. import java.util.regex.Matcher;
  2. import java.util.regex.Pattern;
  3. public class Demo {
  4.     private static final String regEx_script = "<script[^>]*?>[\\s\\S]*?<\\/script>"// 定義script的正則表示式
  5.     private static final String regEx_style = "<style[^>]*?>[\\s\\S]*?<\\/style>"// 定義style的正則表示式
  6.     private static final String regEx_html = "<[^>]+>"
    // 定義HTML標籤的正則表示式
  7.     private static final String regEx_space = "\\s*|\t|\r|\n";//定義空格回車換行符
  8.     /**
  9.      * @param htmlStr
  10.      * @return
  11.      *  刪除Html標籤
  12.      */
  13.     public static String delHTMLTag(String htmlStr) {
  14.         Pattern p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
  15.         Matcher m_script = p_script.matcher(htmlStr);
  16.         htmlStr = m_script.replaceAll(""); // 過濾script標籤
  17.         Pattern p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);
  18.         Matcher m_style = p_style.matcher(htmlStr);
  19.         htmlStr = m_style.replaceAll(""); // 過濾style標籤
  20.         Pattern p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
  21.         Matcher m_html = p_html.matcher(htmlStr);
  22.         htmlStr = m_html.replaceAll(""); // 過濾html標籤
  23.         Pattern p_space = Pattern.compile(regEx_space, Pattern.CASE_INSENSITIVE);
  24.         Matcher m_space = p_space.matcher(htmlStr);
  25.         htmlStr = m_space.replaceAll(""); // 過濾空格回車標籤
  26.         return htmlStr.trim(); // 返回文字字串
  27.     }
  28.     public static String getTextFromHtml(String htmlStr){
  29.         htmlStr = delHTMLTag(htmlStr);
  30.         htmlStr = htmlStr.replaceAll(" """);
  31.         htmlStr = htmlStr.substring(0,100);
  32.         return htmlStr;
  33.     }
  34.     public static void main(String[] args) {
  35.         String str = "ubuntu 安裝 phpmyadmin  兩種 (兩者選一):\n" +
  36.             "<h4>1: apt-get 安裝  然後使用 已有的虛擬主機目錄建立軟連線</h4>\n" +
  37.             "<div class=\"dp-highlighter\">\n" +
  38.             "<ol class=\"dp-xml\" start=\"1\">\n" +
  39.             " \t<li class=\"alt\">sudo  apt-get install  phpmyadmin</li>\n" +
  40.             " \t<li class=\"\">sudo  ln-s /usr/share/phpmyadmin/      /var/www/pma</li>\n" +
  41.             "</ol>\n" +
  42.             "</div>\n" +
  43.             "<h4>2:手動上傳</h4>\n" +
  44.             "網上下載 phpmyadmin軟體包,使用 filezilla 上傳到 /var/www/pma (pma自己建立)\n" +
  45.             "\n" +
  46.             "使用 ip/pma 檢視 phpmyadmin\n" +
  47.             "\n" +
  48.             "其實 還可以 考慮給phpmyadmin 配置虛擬主機\n" +
  49.             "\n" +
  50.             "接下來 配置MySQL的  remote access\n" +
  51.             "\n" +
  52.             "預設下 mysql只能是本機訪問的 但是 如果我通過ip 遠端 訪問方式 就是 remote access      比如 我在其他機器上要使用navicate 訪問  也屬於 remote access\n" +
  53.             "\n" +
  54.             "但是 ubuntu中的mysql 預設是不允許的 所以要修改mysql的配置\n" +
  55.             "\n" +
  56.             "sudo vim /etc/mysql/my.cnf #修改     bind-address 白名單 取消掉\n" +
  57.             "\n" +
  58.             "<img src=\"https://img-blog.csdn.net/20140914221520765?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZzc5NDY4NjcxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast\" alt=\"\" />\n" +
  59.             "<h4></h4>\n" +
  60.             "<h4>進入phpmyadmin</h4>\n" +
  61.             "檢視 使用者 新增一個使用者 可以 用 公網的ip 訪問:\n" +
  62.             "\n" +
  63.             "<img src=\"https://img-blog.csdn.net/20140914222446977?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZzc5NDY4NjcxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast\" alt=\"\" />\n" +
  64.             "\n" +
  65.             "<img src=\"https://img-blog.csdn.net/20140914222456821?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZzc5NDY4NjcxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast\" alt=\"\" />\n" +
  66.             "<h4>重啟msyql</h4>\n" +
  67.             "<div class=\"dp-highlighter\">\n" +
  68.             "<ol class=\"dp-xml\" start=\"1\">\n" +
  69.             " \t<li class=\"alt\">sudo  service  mysql restart</li>\n" +
  70.             "</ol>\n" +
  71.             "</div>\n" +
  72.             "使用navicate測試遠端登入:\n" +
  73.             "\n" +
  74.             "<img src=\"https://img-blog.csdn.net/20140914222659905?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZzc5NDY4NjcxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast\" alt=\"\" />\n" +
  75.             "\n" +
  76.             "<img src=\"https://img-blog.csdn.net/20140914222803896?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZzc5NDY4NjcxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast\" alt=\"\" />\n" +
  77.             "\n" +
  78.             "以上  遠端登入 已經 完成\n" +
  79.             "\n" +
  80.             "&nbsp;\n" +
  81.             "\n" +
  82.             "更多文章\n" +
  83.             "\n" +
  84.             "<a href=\"http://liuyanzhao.com/2009.html\" target=\"_blank\" rel=\"noopener noreferrer\">ubuntu14.04 下 mysql 儲存目錄遷移</a>\n" +
  85.             "\n" +
  86.             "<a href=\"http://liuyanzhao.com/1978.html\" target=\"_blank\" rel=\"noopener noreferrer\">ubuntu14.04下配置apache虛擬主機</a>\n" +
  87.             "\n" +
  88.             "<a href=\"http://liuyanzhao.com/2447.html\" target=\"_blank\" rel=\"noopener noreferrer\">ubuntu14.04 安裝phpmyadmin 和配置</a>\n" +
  89.             "\n" +
  90.             "&nbsp;\n" +
  91.             "\n" +
  92.             "&nbsp;\n" +
  93.             "\n" +
  94.             "本文地址:<a href=\"http://liuyanzhao.com/2447.html\" target=\"_blank\" rel=\"noopener noreferrer\">http://liuyanzhao.com/2447.html</a>\n" +
  95.             "\n" +
  96.             "轉載請註明\n" +
  97.             "\n" +
  98.             "&nbsp;";
  99.         System.out.println(getTextFromHtml(str));
  100.     }
  101. }

JSP 實現

這裡我們需要自定義標籤

1、在WEB-INF 下新建一個 myTag.dtd 檔案

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE taglib
  3.         PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
  4.         "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
  5. <taglib>
  6.     <tlib-version>1.0</tlib-version><!-- 代表標籤庫的版本號 -->
  7.     <jsp-version>1.2</jsp-version><!-- 代表jsp的版本 -->
  8.     <short-name>SimpleTag</short-name><!-- 你的標籤庫的簡稱 -->
  9.     <uri>http://liuyanzhao.com</uri><!-- 你標籤庫的引用uri -->
  10.     <tag>
  11.         <name>htmlFilter</name>
  12.         <tag-class>com.liuyanzhao.blog.util.others.HtmlFilterTag</tag-class>
  13.         <body-content>scriptless</body-content>
  14.     </tag>
  15. </taglib>

注意:

<short-name> 和 <uri> 可以隨便填

<tag>標籤內的 <name> 和下面的類名一致,<tag-class>是類的地址,<body-content> 這裡就填 scriptless好了,意思是標籤體內可以放文字,jsp標籤和其他任意標籤

2、在對應位置新建 HtmlFilterTag.java

  1. package com.liuyanzhao.blog.util.others;
  2. /**
  3.  * Created by 言曌 on 2017/8/26.
  4.  */
  5.     import java.io.IOException;
  6.     import java.io.StringWriter;
  7.     import java.util.regex.Matcher;
  8.     import java.util.regex.Pattern;
  9.     import javax.servlet.jsp.JspException;
  10.     import javax.servlet.jsp.PageContext;
  11.     import javax.servlet.jsp.tagext.JspFragment;
  12.     import javax.servlet.jsp.tagext.SimpleTagSupport;
  13. public class HtmlFilterTag extends SimpleTagSupport {
  14.     private static final int subLength = 200//擷取字串長度
  15.     private static final String regEx_script = "<script[^>]*?>[\\s\\S]*?<\\/script>"// 定義script的正則表示式
  16.     private static final String regEx_style = "<style[^>]*?>[\\s\\S]*?<\\/style>"// 定義style的正則表示式
  17.     private static final String regEx_html = "<[^>]+>"// 定義HTML標籤的正則表示式
  18.     private static final String regEx_space = "\\s*|\t|\r|\n";//定義空格回車換行符
  19.     public static String filter(String htmlStr) {
  20.         Pattern p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
  21.         Matcher m_script = p_script.matcher(htmlStr);
  22.         htmlStr = m_script.replaceAll(""); // 過濾script標籤
  23.         Pattern p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);
  24.         Matcher m_style = p_style.matcher(htmlStr);
  25.         htmlStr = m_style.replaceAll(""); // 過濾style標籤
  26.         Pattern p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
  27.         Matcher m_html = p_html.matcher(htmlStr);
  28.         htmlStr = m_html.replaceAll(""); // 過濾html標籤
  29.         Pattern p_space = Pattern.compile(regEx_space, Pattern.CASE_INSENSITIVE);
  30.         Matcher m_space = p_space.matcher(htmlStr);
  31.         htmlStr = m_space.replaceAll(""); // 過濾空格回車標籤
  32.         return htmlStr.trim(); // 返回文字字串
  33.     }
  34.     @Override
  35.     public void doTag() throws JspException, IOException {
  36.         StringWriter sw = new StringWriter();
  37.         JspFragment jf = this.getJspBody();
  38.         jf.invoke(sw);
  39.         String content = sw.getBuffer().toString();
  40.         content = filter(content);
  41.         content = content.replaceAll(" """);
  42.         int contentLength =content.length();
  43.         if(contentLength>subLength) {
  44.             content = content.substring(0,subLength);
  45.         } else {
  46.             content = content.substring(0,contentLength);
  47.         }
  48.         ((PageContext) this.getJspContext()).getOut().write(content);
  49.     }
  50. }

注意:

大家也可以按照自己的需求,修改上面的程式碼

3、在 jsp 裡呼叫,以下是部分 jsp 程式碼

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2.          pageEncoding="UTF-8"%>
  3. <%@ taglib uri="/WEB-INF/myTag.dtd" prefix="lyz"%>  
  4. <!DOCTYPE html>
  5. <html lang="zh-CN">
  6. <head>
  7.     <meta charset="utf-8">
  8. </head>
  9. <body>
  10.        <lyz:htmlFilter>  ${article.content} </lyz:htmlFilter>  
  11. </body>
  12. </html>

注意:

一定要引入 dtd 檔案,注意你的路徑,prefix 填你的標籤字首,比如我填的是 lyz,下面呼叫的話,字首保持正確即可

4、最終效果如下