根据你的要求,我将详细讲解“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地址,并在该地址的末尾进行截取。下面是具体的实现步骤:
- 使用正则表达式来检测原文中是否包含url地址,如果有,将其保存下来。
javascript
var urlRegex = /(?:https?|ftp|mailto):\/\/[\S]+/g;
var urls = str.match(urlRegex); - 使用
replace()
函数将url地址替换成一个占位符,这样就可以方便地对文本进行截取了
javascript
var strWithoutUrls = str.replace(urlRegex, '[URL]'); - 对截取字符串操作,保证截取的长度不会从url地址中间裁剪
javascript
var truncatedStr = strWithoutUrls.substring(0, maxLength);
truncatedStr = truncatedStr.substr(0, Math.min(truncatedStr.length, truncatedStr.lastIndexOf(' '))); - 将占位符重新替换成url地址
javascript
truncatedStr = truncatedStr.replace(/\[URL\]/g, function() {
return urls.shift();
});
这样,就可以得到截取后保留url地址的字符串。
方法二:使用DOM操作
另一种方法是利用DOM操作来实现,具体步骤如下:
- 创建一个DOM元素,将截取后的字符串赋值给该元素的innerHTML属性
javascript
var el = document.createElement('div');
el.innerHTML = str.substring(0, maxLength); - 判断元素的实际高度是否超过了限定的高度,如果超过,则截取其中文本内容
javascript
if (el.offsetHeight > maxHeight) {
// 截取元素内容,保证不截断URL
while (el.offsetHeight > maxHeight) {
el.innerHTML = el.innerHTML.substring(0, el.innerHTML.lastIndexOf(' '));
}
el.innerHTML += '...';
} - 使用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技术站