2010.2.6 日修正
————————————
2010.2.3 日修正
<html> <!-- html字符截断第二版 bug修正 + 2.6日修正--> <script> function sub_html_str(str, num) { var reg = new RegExp( '<[^>]+>' , 'g' ); var rt, rts = [], indexs = [], tstr, endstr, rstr, sstr, endtag, rtstr; //提取所有的html标签和标签在字符串中的位置 while ( ( rt = reg.exec(str) ) != null ) { rts.push(rt[0]); indexs.push(rt['index']); } //删除字符串中所有的html标签 tstr = str.replace(reg, ''); //对剩余的纯字符串进行substr sstr = tstr.substr(num, tstr.length); tstr = tstr.substr(0, num); //判断有没有把实体腰斩,如果有腰斩的就再接上 endstr = (/&[^&]*$/.exec(tstr) || ''); if ( endstr !== '' ) endstr += '' + (/^[^;]*;/.exec(sstr) || ''); if (/^(&\w{1,10};|&#\d+;)$/.test(endstr)) { rtstr = tstr.replace(/&[^&]*$/, endstr); } else { rtstr = tstr; } //把html标签放回到截断完毕的字符串中,当然有的html标签这时候已经无家可归了 var index = 0; for (var i = 0; i < rts.length; i ++) { index = indexs[i]; if (rtstr.length >= index) { rtstr = rtstr.substr(0, index) + rts[i] + rtstr.substr(index, rtstr.length); } else { break; } } var lastindex = i ; //下面的代码用来闭合没有闭合的标签 tstr = rtstr; rstr = ''; //把闭合的标签全部删除,sstr包含了没有闭合的标签 while ( rstr != tstr ) { rstr = tstr; tstr = tstr.replace(/<[^\/][^>]*>[^<]*<\/[^>]+>/g, '').replace(/<[^>]+ \/>/g, ''); } sstr = tstr; //在剩余的部分查找没有闭合的标签 tstr = str.replace(rtstr, ''); rstr = ''; while ( rstr != tstr ) { rstr = tstr; tstr = tstr.replace(/<[^\/][^>]*>[^<]*<\/[^>]+>/g, '').replace(/<[^>]+ \/>/g, ''); } reg.lastIndex = 0; var endreg = new RegExp('<\/[^>]+>', 'g'); //如果存在没有闭合的标签,从无家可归的标签里找下半身 while ( reg.exec(sstr) != null ) { if ( (rt = endreg.exec(tstr)) != null) { rtstr += rt[0]; } else { break; } } return rtstr; } </script> <script> document.writeln('<textarea cols="100" rows="10">'); document.writeln(sub_html_str('<xx><oo>嵌套标签截断测试</oo><fk><test>lala</test></fk></xx>', 5)); document.writeln(sub_html_str('正常字符串测试', 5)); document.writeln(sub_html_str('<xx>带标签的字符串截断</xx>', 5)); document.writeln(sub_html_str('<xx><oo>嵌套标签截断测试</oo><fk>lala</fk></xx>', 5)); document.writeln(sub_html_str('<xx><oo>嵌套标签<img src="http://www.google.com/logo.gif" />截断测试</oo></xx>', 5)); document.writeln(sub_html_str('<xx><oo>实体截断 测试测试</oo></xx>', 5)); document.writeln('</textarea>'); </script> </html>
——————————————————–
最近各位弟兄都很忙的样子,俺则已经沦为做活动页面的了。。html字符的截断一般都会放到后台技术们做,但是春节的这个东西比较紧,偶就前端代劳一下。
运气不错,这么长的函数没调几次就过了。也是按照自己的思路来。。。
这个函数仅能做到
- 截取除了html标签之外的前n个字符,一般的需求都是这样的。。
- 不会截断html实体
- 查找并闭合被截断的html标签,但是如果给的html就存在没有闭合的就不管了
<html> <!-- html字符截断第一版 --> <script> function sub_html_str(str, num) { var reg = new RegExp( '<[^>]+>' , 'g' ); var rt, rts = [], indexs = [], tstr, endstr, rstr, endtag; //提取所有的html标签和标签在字符串中的位置 while ( ( rt = reg.exec(str) ) != null ) { rts.push(rt[0]); indexs.push(rt['index']); } //删除字符串中所有的html标签 str = str.replace(reg, ''); //对剩余的纯字符串进行substr tstr = str.substr(0, num); //判断有没有把实体腰斩,如果有腰斩的就再接上 endstr = (/&[^&]*$/.exec(tstr) || ''); if ( endstr !== '' ) endstr += '' + (/^[^;]*;/.exec(str.substr(num, str.length)) || ''); if (/^(&\w{1,10};|&#\d+;)$/.test(endstr)) { str = tstr.replace(/&[^&]*$/, endstr); } else { str = tstr; } //把html标签放回到截断完毕的字符串中,当然有的html标签这时候已经无家可归了 var index = 0; for (var i = 0; i < rts.length; i ++) { index = indexs[i]; if (str.length >= index) { str = str.substr(0, index) + rts[i] + str.substr(index, str.length); } else { break; } } var lastindex = i ; //下面的代码用来闭合没有闭合的标签 tstr = str; rstr = ''; //把闭合的标签全部删除,tstr包含了没有闭合的标签 while ( rstr != tstr ) { rstr = tstr; tstr = tstr.replace(/<[^>]+>[^<]*<\/[^>]+>/g, '').replace(/<[^>]+ \/>/g, ''); } reg.lastIndex = 0; //如果存在没有闭合的标签,从无家可归的标签里找下半身 while ( reg.exec(rstr) != null ) { while ( lastindex < rts.length ) { endtag = rts[lastindex]; //如果它是一个用来闭合的标签,就把它追加到字符串 if ( /^<[ ]*\//.test(endtag) ) { str = str + endtag; lastindex ++; break; } //如果它是自闭合的标签 else if ( /<[^>]+ \/>/.test(endtag) ) { lastindex ++; } //如果它是一个起始标签 else { lastindex += 2; } } } return str; } </script> <script> document.writeln('<textarea cols="100" rows="10">'); document.writeln(sub_html_str('正常字符串测试', 5)); document.writeln(sub_html_str('<xx>带标签的字符串截断</xx>', 5)); document.writeln(sub_html_str('<xx><oo>嵌套标签截断测试</oo><fk>lala</fk></xx>', 5)); document.writeln(sub_html_str('<xx><oo>嵌套标签<img src="http://www.google.com/logo.gif" />截断测试</oo></xx>', 5)); document.writeln(sub_html_str('<xx><oo>实体截断 测试测试</oo></xx>', 5)); document.writeln('</textarea>'); </script> </html>

好强大
2010年02月4日 @ 09:16