js中根据字数截取字符串,不能截断url

根据你的要求,我将详细讲解“JS中根据字数截取字符串,不能截断URL”问题的解决方案。

问题描述

在web开发中,我们可能会遇到这样的场景:需要在显示文本时截取字符串,限制其最大字数,但是需要保留其中的url地址,也就是说,不能简单的按照字符数截断字符串,而是需要在url出现的位置进行裁剪。例如:

原文本:This is an example of a long text including a url http://www.example.com/that-needs-to-be-partially-truncated. 
目标:This is an example of a long text including a url http://www.example.com/that-needs-...。

如何实现这个功能呢?下面就介绍两种常用的方法。

方法一:使用正则表达式

一种实现方法是使用正则表达式来匹配url地址,并在该地址的末尾进行截取。下面是具体的实现步骤:

  1. 使用正则表达式来检测原文中是否包含url地址,如果有,将其保存下来。
    javascript
    var urlRegex = /(?:https?|ftp|mailto):\/\/[\S]+/g;
    var urls = str.match(urlRegex);
  2. 使用replace()函数将url地址替换成一个占位符,这样就可以方便地对文本进行截取了
    javascript
    var strWithoutUrls = str.replace(urlRegex, '[URL]');
  3. 对截取字符串操作,保证截取的长度不会从url地址中间裁剪
    javascript
    var truncatedStr = strWithoutUrls.substring(0, maxLength);
    truncatedStr = truncatedStr.substr(0, Math.min(truncatedStr.length, truncatedStr.lastIndexOf(' ')));
  4. 将占位符重新替换成url地址
    javascript
    truncatedStr = truncatedStr.replace(/\[URL\]/g, function() {
    return urls.shift();
    });

这样,就可以得到截取后保留url地址的字符串。

方法二:使用DOM操作

另一种方法是利用DOM操作来实现,具体步骤如下:

  1. 创建一个DOM元素,将截取后的字符串赋值给该元素的innerHTML属性
    javascript
    var el = document.createElement('div');
    el.innerHTML = str.substring(0, maxLength);
  2. 判断元素的实际高度是否超过了限定的高度,如果超过,则截取其中文本内容
    javascript
    if (el.offsetHeight > maxHeight) {
    // 截取元素内容,保证不截断URL
    while (el.offsetHeight > maxHeight) {
    el.innerHTML = el.innerHTML.substring(0, el.innerHTML.lastIndexOf(' '));
    }
    el.innerHTML += '...';
    }
  3. 使用innerHTML获取处理后的文本内容
    javascript
    var truncatedStr = el.innerHTML;

这种方法看起来比较麻烦,但是实际上具有更好的浏览器兼容性,也更加精准地处理了HTML文本的渲染。

示例说明

为了更好地理解这两种方法,接下来我们来演示一下使用正则表达式的代码示例以及使用DOM操作的代码示例。

示例一:使用正则表达式

function truncateText(str, maxLength) {
   var urlRegex = /(?:https?|ftp|mailto):\/\/[\S]+/g;
   var urls = str.match(urlRegex);

   var strWithoutUrls = str.replace(urlRegex, '[URL]');
   var truncatedStr = strWithoutUrls.substring(0, maxLength);
   truncatedStr = truncatedStr.substr(0, Math.min(truncatedStr.length, truncatedStr.lastIndexOf(' ')));
   truncatedStr = truncatedStr.replace(/\[URL\]/g, function() {
      return urls.shift();
   });

   return truncatedStr + '...';
};

var text = 'This is an example of a long text including a url http://www.example.com/that-needs-to-be-partially-truncated.';

console.log(truncateText(text, 50));

运行结果:This is an example of a long text including a url http://www.example.com/that-needs-to...

示例二:使用DOM操作

function truncateText(str, maxHeight) {
   var el = document.createElement('div');
   el.innerHTML = str;

   // 计算出需要截取的字符索引
   var length = str.length;
   var low = 0;
   var high = length - 1;
   var index = -1;
   while (low <= high) {
      var mid = Math.floor((low + high) / 2);
      el.innerHTML = str.substring(0, mid + 1);
      if (el.offsetHeight <= maxHeight) {
         index = mid;
         low = mid + 1;
      } else {
         high = mid - 1;
      }
   }

   // 截取字符串,并加上省略号
   var truncatedStr = (index == -1) ? str : str.substring(0, index + 1) + '...';
   return truncatedStr;
};

var text = 'This is an example of a long text including a url http://www.example.com/that-needs-to-be-partially-truncated.';
var maxHeight = 100;

console.log(truncateText(text, maxHeight));

运行结果:This is an example of a long text including a url http://www.example.com/that-needs-to-be-partially-truncated.

以上就是根据字数截取字符串时不能截断url的完整攻略,希望可以帮助到你。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js中根据字数截取字符串,不能截断url - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • JavaScript格式化日期时间的方法和自定义格式化函数示例

    JavaScript格式化日期时间的方法和自定义格式化函数示例 在JavaScript中,格式化日期时间是一个常见的需求。本文将介绍在JavaScript中格式化日期时间的方法和自定义格式化函数示例。 提供内置的日期时间格式化方法 在JavaScript中,可以使用Date对象提供的内置方法来格式化日期时间。以下是一些常见的方法及其描述: getFullYe…

    JavaScript 2023年5月27日
    00
  • Javascript基于对象三大特性(封装性、继承性、多态性)

    JavaScript是基于对象设计的一种编程语言,其三大特性分别是封装性、继承性和多态性。下面我们将对这三个特性分别进行详细的介绍和示例说明。 封装性 封装性是指将对象的属性和方法组合成一个单独的单元,即封装成一个类。封装性可以隐藏对象的具体实现方式,只暴露必要的接口给外部使用,提高代码的安全性和可维护性。 示例一 class Person { constr…

    JavaScript 2023年5月27日
    00
  • javascript 三种方法实现获得和设置以及移除元素属性

    JavaScript 三种方法实现获得和设置以及移除元素属性 在 JavaScript 中,我们可以通过以下三种不同的方法来获取、设置或者移除 DOM 元素的属性: getAttribute() 和 setAttribute() .属性名 .dataset 1. getAttribute() 和 setAttribute() 方法 getAttribute(…

    JavaScript 2023年5月28日
    00
  • 基于javascript的无缝滚动动画实现2

    针对”基于javascript的无缝滚动动画实现2″,我来给您详细讲解一下。 简介 无缝滚动动画是Web开发中较为常见的功能,通常用于实现图片、文字等大块内容的滚动展示。本攻略将介绍使用JavaScript实现无缝滚动动画的方法。 实现过程 本攻略实现的无缝滚动动画需要以下主要步骤: 创建HTML布局:需要创建一个固定大小的div容器,再将需要滚动展示的内容…

    JavaScript 2023年6月10日
    00
  • js接收并转化Java中的数组对象的方法

    要在JavaScript中处理从Java传递过来的数组对象,需要进行以下步骤: 将Java数组对象转换为JSON字符串或JavaScript数组 在JavaScript中使用JSON.parse()方法或直接使用JavaScript数组对其进行操作 下面,我们将为您介绍具体步骤: 将Java数组对象转换为JSON字符串 在Java中,您可以使用Gson或Ja…

    JavaScript 2023年5月27日
    00
  • 浅谈js正则之test方法bug篇

    浅谈js正则之test方法bug篇 1. 什么是js正则之test方法bug 在JavaScript中,正则表达式是非常有用的,它可以用来匹配、查找和替换字符串中的文本。而test方法就是正则表达式中的一个非常重要的方法之一,它用来测试一个字符串是否匹配某个正则表达式,返回值为布尔值。 然而,在一些特定情况下,test方法会出现一些“奇怪”的行为,它并不按照…

    JavaScript 2023年6月10日
    00
  • axios拦截器、ElementUI组件的使用方法

    axios拦截器使用方法 1. 安装Axios Axios是一个基于Promise的HTTP库,可以在浏览器和Node.js中使用。安装Axios,请在命令行输入以下命令: npm install axios 2. 添加拦截器 可以使用Axios的拦截器来在请求或响应被处理前拦截它们。 以下是一个示例,向请求头中添加Authorization: import…

    JavaScript 2023年6月10日
    00
  • JavaScript调试工具汇总

    首先我们需要了解什么是JavaScript调试。 JavaScript调试是指在开发中检测和修复代码错误的过程。常见的JavaScript调试方法有console.log、debugger关键字、浏览器的开发者工具等。 而“JavaScript调试工具汇总”是向开发者介绍了多种可供使用的JavaScript调试工具,包括网络抓包工具、JavaScript专用…

    JavaScript 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部