用JavaScript实现截取指定长度的HTML字符串

本文介绍了一种处理HTML字符串的方法,确保字符串被截断时不会出现未闭合的标签。通过定位并调整字符串中的标签位置,可以有效避免显示不完整的问题。文章提供了具体的实现算法,并解释了如何处理位于标签属性或内容中的截断位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       /*   
        * 调整截取的字符串的位置。因为在截取一个字符串后可能存在两种情况:
        * (1)字符串末位正好处于一个标签的属性之中的某个位置。如:<a id="xxx"  href="xxx"
></a>中红色标注的位置。
        * (2)字符串末位处于一个标签内容之中的某个位置。如:<a
>here
</a> 中红色标注的位置。
        *  对于这两种情况,第二种情况可以无需特殊处理,但是第一种情况的话得将整个标签删除或者将其属性补全。删除的话
        *  将字符串的末尾位置前移至标签开始之前;而补全则是将末尾位置后移至次标签的'>'处。这里采用的是删除的方法。
        */
	function adjustByTagPostion(str){
		var left_brace_index = str.lastIndexOf('<');
		var right_brace_index = str.lastIndexOf('>');
		// 为true的话则表示字符串处于第一种情况,需要进行删除操作。
               var inTagDefinition = left_brace_index > right_brace_index;
		return inTagDefinition ? str.substring(0,left_brace_index) : str;
	}

	// 将未闭合的标签按序闭合。
	function modifyDisplayString(original, addTags){
		var tagLenth = addTags.length;
		for(var i = tagLenth-1; i >= 0; i--){
			original += '</' + addTags[i] + '>';
		}
		return original;
	}

	// 
	function splitString(original, length){
               // 此数组用于保存那些未闭合的标签。
		var non_match_tag = []
               // 如果大于字符串的总长度,返回整个字符串;否则返回指定长度的子串
 		var to = length >= original.length ? original.length : length;
		var substring = original.substring(0,to);

               // 调整字符串。
		adjustedSubString = adjustByTagPostion(substring);
		var tag_pattern = /<\s*(\w+\b)(?:[^>]*[^\/])?>|<(\/\w+)>/ig

		adjustedSubString.replace(tag_pattern, function(match,$1,$2){
			var value = $1 == '' ? ($2 == '' ? '' : $2) : $1;
			if(value.charAt(0) == '/'){
                               // 为真表示这个标签是前面最后一个为闭合标签的闭合,因此,将此标签从数组中删除。
 				if(non_match_tag.length > 0 && non_match_tag[non_match_tag.length-1] == value.substring(1)){
					non_match_tag.pop();
				}
			}else{
                               // 新的未闭合的标签,将其添加到数组中。
				non_match_tag.push(value);
			}
               });

		return modifyDisplayString(adjustedSubString, non_match_tag);
	}

 

 

<think>好的,用户想在Vue2中实现字符串截取指定长度的功能,我需要详细解答并提供示例。首先,用户的问题可能涉及到前端显示限制,比如在列表或卡片中显示部分文本,超出部分用省略号代替。根据用户提供的引用,特别是引用[3]和引用[4],提到了JavaScript字符串方法如substring、substr、slice,以及Vue中如何操作字符串。首先,我需要确定在Vue2中如何正确使用这些方法。Vue的模板语法支持直接调用JavaScript方法,所以可以在插值表达式中使用。例如,{{ text.slice(0,10) }}。但需要注意截取后的字符串添加省略号的情况,比如当字符串超过指定长度时才添加,否则保持原样。然后,考虑到用户可能需要一个更灵活的方法,比如一个自定义过滤器或方法,这样可以在多个地方复用。引用[5]中提到了在Vue中拼接变量和字符串,使用模板字符串,这可能对处理截取后的字符串拼接有帮助。 另外,用户可能还需要处理中英文混合的情况,因为引用[2]提到字符串长度和宽度不同,可能涉及字符宽度计算,但用户当前的问题可能暂时不需要这么复杂,先专注于字符长度截取。不过,可能需要提到这一点作为扩展。接下来,我需要整理出几种方法:直接在模板中使用slice,使用计算属性,使用自定义过滤器,以及在方法中处理。同时,要给出每种方法的示例代码,并说明它们的适用场景。 还要注意,用户可能希望截取后添加省略号,所以示例中需要包括条件判断,当字符串长度超过指定长度时才添加。例如,使用三元表达式。最后,生成相关问题,可能涉及字符串处理的其他方面,比如多语言处理、性能优化等,帮助用户深入理解。</think>### Vue2中实现字符串截取指定长度的4种方法 #### 方法一:直接在模板中使用slice方法 ```html <template> <div>{{ originText.slice(0, maxLength) }}{{ originText.length > maxLength ? '...' : '' }}</div> </template> <script> export default { data() { return { originText: '这是一个需要截取的超长示例文本', maxLength: 10 } } } </script> ``` *特点:简单直接,适用于简单场景[^3][^4]* #### 方法二:使用计算属性(推荐) ```html <template> <div>{{ truncatedText }}</div> </template> <script> export default { data() { return { originText: 'Vue.js字符串截取最佳实践', maxLength: 8 } }, computed: { truncatedText() { return this.originText.length > this.maxLength ? this.originText.substr(0, this.maxLength) + '...' : this.originText } } } </script> ``` *特点:响应式更新,逻辑与视图分离[^4]* #### 方法三:自定义过滤器 ```javascript // main.js Vue.filter('truncate', function (value, length) { if (!value) return '' value = value.toString() return value.length > length ? value.substring(0, length) + '...' : value }) // 组件中使用 <template> <div>{{ originText | truncate(15) }}</div> </template> ``` *特点:全局复用,管道式语法[^5]* #### 方法四:带字符宽度计算的截取(中英文混合) ```javascript methods: { truncateByWidth(str, maxWidth) { let width = 0 let result = '' for(let char of str) { width += /[\u4e00-\u9fa5]/.test(char) ? 2 : 1 // 中文算2个字符宽度 if(width > maxWidth) break result += char } return result + (width > maxWidth ? '...' : '') } } // 使用示例 {{ truncateByWidth(originText, 20) }} ``` *特点:考虑中文双字节字符的显示宽度[^2]* ### 不同截取方法对比表 | 方法 | 语法特点 | 适用场景 | |-------------|----------------------------------|--------------------------| | slice() | 参数为开始/结束索引 | 精确控制字符位置 | | substr() | 参数为开始位置/截取长度 | 需要指定截取长度时 | | substring() | 参数为开始/结束索引(自动排序) | 忽略参数顺序的场景 | ### 最佳实践建议 1. **响应式更新**:使用计算属性确保数据变化时自动更新 2. **国际化处理**:使用字符宽度计算方法处理多语言混合场景 3. **性能优化**:对于长文本建议在服务端预处理 4. **省略号控制**:使用CSS`text-overflow: ellipsis`实现更优雅的截断 ```css /* CSS截断方案(固定宽度容器) */ .truncate { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 200px; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值