使用JSDOM安全截斷文章HTML內容

????????在Web開發中,經常需要處理大量的HTML內容,尤其是在展示文章預覽、動態加載內容或限制顯示長度等場景中。直接截斷HTML字符串可能會導致頁面布局混亂、樣式錯誤或標簽不完整等問題。為了安全地截斷HTML內容,我們可以利用jsdom庫來解析HTML,并構建截斷后的HTML字符串。

1、引入JSDOM庫

????????首先,確保已經安裝了jsdom庫。如果尚未安裝,可以使用npm(Node.js的包管理器)進行安裝:

npm install jsdom

2、安全截斷HTML內容的策略

安全截斷HTML內容的關鍵在于確保截斷后的HTML依然保持結構的完整性。以下是一個使用jsdom庫來實現安全截斷HTML內容的策略:

  1. 使用JSDOM解析HTML:創建一個JSDOM實例來解析HTML內容,并獲取到解析后的DOM樹。
  2. 遍歷DOM樹:從DOM樹的根節點開始,逐個遍歷子節點。
  3. 處理文本節點:當遇到文本節點時,檢查其長度是否超過最大長度限制。如果超過,則截斷文本并添加省略號;否則,直接添加文本內容。
  4. 處理元素節點:當遇到元素節點時,首先檢查整個元素(包括其內容)的長度是否超過最大長度限制。如果未超過,則直接添加該元素的outerHTML;如果超過,則需要進一步處理。
  5. 處理元素節點的內部文本:對于超過長度限制的元素節點,需要遍歷其內部的文本節點,并嘗試截斷文本。由于直接截斷元素可能會導致未關閉的標簽,因此我們只截斷內部的文本內容,并保留元素的開放標簽。
  6. 返回截斷后的HTML:遍歷完成后,返回截斷后的HTML字符串。

3、具體實現方法

????????下面是使用上述策略實現安全截斷HTML內容的示例代碼:

const { JSDOM } = require('jsdom');  function truncateHtml(html, maxLength) {  // 創建一個包含傳入HTML的完整文檔  const dom = new JSDOM(`<!DOCTYPE html><html><head></head><body>${html}</body></html>`);  const { document } = dom.window;  let totalLength = 0;  let truncatedHtml = '';  let currentNode = document.body.firstChild;  // 遍歷DOM樹  while (currentNode) {  if (currentNode.nodeType === Node.TEXT_NODE) { // 文本節點  const textContent = currentNode.textContent;  const remainingLength = maxLength - totalLength;  if (textContent.length > remainingLength) {  // 截斷文本并添加省略號  truncatedHtml += textContent.substring(0, remainingLength) + '...';  break;  } else {  truncatedHtml += textContent;  totalLength += textContent.length;  }  } else if (currentNode.nodeType === Node.ELEMENT_NODE) { // 元素節點  // 檢查整個元素(包括內容)的長度  const elementHtml = currentNode.outerHTML;  if (totalLength + elementHtml.length <= maxLength) {  truncatedHtml += elementHtml;  totalLength += elementHtml.length;  } else {  // 如果超過長度限制,則截斷元素內的文本節點  const clone = currentNode.cloneNode(false); // 不復制子節點  truncatedHtml += '<' + clone.nodeName + '>'; // 添加開放標簽  // 遍歷子節點并嘗試截斷文本  for (let child of currentNode.childNodes) {  if (child.nodeType === Node.TEXT_NODE) {  const textClone = child.cloneNode(true); // 復制文本節點  const textContent = textClone.textContent;  const textLength = textContent.length;  if (totalLength + textLength <= maxLength) {  truncatedHtml += textContent;  totalLength += textLength;  } else {  truncatedHtml += textContent.substring(0, maxLength - totalLength) + '...';  break;  }  }  }  // 跳出循環,因為已經處理了超過長度的元素  break;  }  }  currentNode = currentNode.nextSibling;  }  // 返回截斷后的HTML  return truncatedHtml;  
}  // 使用示例  
const pageContent = '<p>這是一篇<b>很長</b>的文章,包含<a href="#">多個</a>HTML<br>標簽。</p>';  
const truncatedContent = truncateHtml(pageContent, 50);  
console.log

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13876.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13876.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13876.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JVM學習-垃圾回收器(一)

垃圾回收器 按線程數分類 串行垃圾回收器 串行回收是在同一時間段內只允許有一個CPU用于執行垃圾回收操作&#xff0c;此時工作線程被暫停&#xff0c;直至垃圾收集工作結束 在諸如單CPU處理器或者較小的應用內存等硬件平臺不是特別優越的場合&#xff0c;串行回收器的性能表…

http和https的區別,怎么免費實現https(內涵教學)

超文本傳輸協議HTTP協議被用于在Web瀏覽器和網站服務器之間傳遞信息&#xff0c;HTTP協議以明文方式發送內容&#xff0c;不提供任何方式的數據加密&#xff0c;如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文&#xff0c;就可以直接讀懂其中的信息&#xff0c;因此&…

etcd 和 MongoDB 的混沌(故障注入)測試方法

最近在對一些自建的數據庫 driver/client 基礎庫的健壯性做混沌&#xff08;故障&#xff09;測試, 去驗證了解業務的故障處理機制和恢復時長. 主要涉及到了 MongoDB 和 etcd 這兩個基礎組件. 本文會介紹下相關的測試方法. MongoDB 中的故障測試 MongoDB 是比較世界上熱門的文…

AI網絡爬蟲:批量爬取電視貓上面的《慶余年》分集劇情

電視貓上面有《慶余年》分集劇情&#xff0c;如何批量爬取下來呢&#xff1f; 先找到每集的鏈接地址&#xff0c;都在這個class"epipage clear"的div標簽里面的li標簽下面的a標簽里面&#xff1a; <a href"/drama/Yy0wHDA/episode">1</a> 這個…

速盾:負載均衡能防ddos攻擊嗎?

負載均衡是一種分布式系統的設計思想&#xff0c;通過將流量分散到多個服務器上&#xff0c;以提高系統的穩定性和可擴展性。然而&#xff0c;負載均衡本身并不能完全防止DDoS攻擊&#xff0c;但可以在一定程度上減輕其影響。 DDoS&#xff08;分布式拒絕服務&#xff09;攻擊…

【C語言】8.C語言操作符詳解(1)

文章目錄 1.操作符的分類2.?進制和進制轉換3.原碼、反碼、補碼4.移位操作符4.1 左移操作符4.2 右移操作符 5.位操作符&#xff1a;&、|、^、~5.1 &&#xff1a;按位與5.2 |&#xff1a;按位或5.3 ^&#xff1a;按位異或5.4 ~&#xff1a;按位取反5.5 例題例題1例題2例…

短視頻矩陣系統4年獨立開發正規代發布接口源碼搭建部署開發

1. 短視頻矩陣源碼技術開發要求及實現流程&#xff1a; 短視頻矩陣源碼開發要求具備視頻錄制、編輯、剪輯、分享等基本功能&#xff0c;支持實時濾鏡、特效、音樂等個性化編輯&#xff0c;能夠實現高效的視頻渲染和處理。開發流程主要包括需求分析、技術選型、設計架構、編碼實…

Web前端開發技術、詳細文章、(例子)html 列表、有序列表、無序列表、列表嵌套

目錄 列表概述 列表類型與標記符號 無序列表 語法&#xff1a; 語法說明&#xff1a; 無序列表標記的 type 屬性及其說明 代碼解釋 有序列表 基本語法 屬性說明 1、列表 o1標記的屬性 2、列表項li標記的屬性 有序列表 o1標記的屬性、值 代碼解釋 列表嵌套 基本…

如何將Qt pro工程文件 改成CMakeLists.txt

Qt pro工程管理文件&#xff0c;本人認為是很好用的&#xff0c;語法簡潔易懂&#xff0c;但是只能在QtCreator中使用&#xff0c;想用使用其它IDE比如Clion或者vs&#xff0c;CMakeLists是種通用的選擇&#xff0c;另外QtCreator的調試功能跟粑粑一樣。 一&#xff0c;思路 …

FreeBSD/Linux下的系統資源監視器排隊隊

bpytop bpytop 是一個基于 Python 的資源監視器&#xff0c;可以在 FreeBSD 上使用。它提供了對文件寫入磁盤、網絡、CPU 和內存占用的監視功能。 pkg install bpytop 或者用ports安裝 cd /usr/ports/sysutils/bpytop/ make install clean bashtop bashtop 也是一個基于 P…

化簡資源分配圖判斷是否發生死鎖

目錄 1.資源分配圖的概念 2.判斷是否發生死鎖 1.資源分配圖的概念 資源分配圖表示進程和資源之間的請求關系&#xff0c;例如下圖&#xff1a; P代表進程&#xff0c;R代表資源&#xff0c;R方框中 有幾個圓球就表示有幾個這種資源&#xff0c;在圖中&#xff0c;R1指向P1&a…

C++ RPC ORM 高速解析

支持所有常用編程語 https://capnproto.org/GitHub - capnproto/capnproto: Capn Proto serialization/RPC system - core tools and C library https://capnproto.org/capnproto-c-win32-1.0.2.zip 常用命令&#xff1a; capnp help capnp compile -oc myschema.capn…

java文件上傳時給pdf、word、excel、ppt、圖片添加水印

前言 在開發的過程中&#xff0c;因為文件的特殊性&#xff0c;需要給pdf、word、excel、ppt、圖片添加水印。添加水印可以在文件上傳時添加&#xff0c;也可以在文件下載時添加。因為業務的某些原因&#xff0c;文件需要在瀏覽器預覽&#xff0c;如果用戶將文件另存為則無法添…

算法與數據結構匯總

基本 數組 字符串 排序 矩陣 模擬 枚舉 字符串匹配 桶排序 計數排序 基數排序 回文&#xff1a;中心擴展 馬拉車 樹上啟發式合并 括號 數學表達式 字符串&#xff1a;前后綴分解。 貢獻法 分組&#xff1a; 【狀態機dp 狀態壓縮 分組】1994. 好子集的數目 【動態規劃】【前綴…

Excel中sum的跨表求和

#實際工作中&#xff0c;一個xlsx文件中會包含多個Excel表格&#xff0c;一般會有“總-分”的關系&#xff0c;如何把分表里的數字匯總到總表里呢&#xff1f; 一般有上圖所示的兩種表達方式。 可以使用通配符 *&#xff1a;代表任意個數、任意字符&#xff1b; &#xff1f;&…

51單片機的最小系統詳解

51單片機的最小系統詳解 1. 引言 在嵌入式系統中,51單片機被廣泛應用于各種小型控制器和嵌入式開發板中。相信很多人都接觸過51單片機,但是對于51單片機的最小系統卻了解得不夠深入。本文將從振蕩電路、電源模塊、復位電路、LED指示燈和調試接口五個方面詳細介紹51單片機的…

quartz定時任務

Quartz 數據結構 quartz采用完全二叉樹&#xff1a;除了最后一層每一層節點都是滿的&#xff0c;而且最后一層靠左排列。 二叉樹節點個數規則&#xff1a;每層從左開始&#xff0c;第一層只有一個&#xff0c;就是2的0次冪&#xff0c;第二層兩個就是2的1次冪&#xff0c;第三…

DOS學習-目錄與文件應用操作經典案例-attrib

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一.前言 二.使用 三.案例 一.前言 DOS系統中的attrib命令是一個用于顯示或更改文件&#…

設計模式——職責鏈(責任鏈)模式

目錄 職責鏈模式 小俱求實習 結構圖 實例 職責鏈模式優點 職責鏈模式缺點 使用場景 1.springmvc流程 ?2.mybatis的執行流程 3.spring的過濾器和攔截器 職責鏈模式 使多個對象都有機會處理請求&#xff0c;從而避免請求的發送者和接受者之間的耦合關系。將這個對象連成…

github設置項目分類

https://www.php.cn/faq/541957.html https://docs.github.com/zh/repositories/working-with-files/managing-files/creating-new-files