Javascript 不要在一个字符串中计算br和nbsp

Javascript 不要在一个字符串中计算br和nbsp,javascript,Javascript,我有一个由br和nbsp组成的字符串;标签,我需要的是,我需要限制字符到100,这意味着只有100个字符应该显示,因为每个br需要4个字符,而不是100个字符,我得到108个,得到下面的输出,我可以在一行 data.substr(0,100) 输出=> 制作一本活字样书是很困难的。它不仅经历了五个世纪,而且还经历了一次飞跃 但它包括br标签我不想删除br和nbsp;但别指望了 预期产出=> 制作一本活字样书是很困难的。它不仅存活了五个世纪,而且还跨越了ele 我做了一些片段,但它给出了108

我有一个由br和nbsp组成的字符串;标签,我需要的是,我需要限制字符到100,这意味着只有100个字符应该显示,因为每个br需要4个字符,而不是100个字符,我得到108个,得到下面的输出,我可以在一行

data.substr(0,100) 
输出=>

制作一本活字样书是很困难的。它不仅经历了五个世纪,而且还经历了一次飞跃

但它包括br标签我不想删除br和nbsp;但别指望了

预期产出=>

制作一本活字样书是很困难的。它不仅存活了五个世纪,而且还跨越了ele

我做了一些片段,但它给出了108的计数

var data=`它可以用来制作一本类型样本书。它不仅存活了五个世纪,而且还跨越到电子排版,基本上保持不变。它在20世纪60年代随着包含Lorem Ipsum段落的Letraset表单的发布而流行,最近随着Aldus PageMaker等桌面出版软件的发布,包括Lorem Ipsum版本` //删除nbsp var docDesc=data.replace/[&]nbsp[;]/gi; //删除br var stringData=docDesc.replace/[]*[>]/gi,; var子数据=stringData.Substr0100 函数testsubData{ var n=子数据.split; 返回n.sliceMath.maxn.length-5,1 } var lastData=testsubData; var lastString=lastData.join var finalData=data.substring0,data.indexOflastString+lastString console.logfinalData
console.logfinalData.length以最简单的形式,您可以编写一个类似子字符串的函数,但不包括一些“单词”,如:

function substringWithExcludes(str, excludes, length) {
    let idx = 0;
    let len = 0;

    while(idx < str.length && len < length){
        let match = false;

        for(let exclude of excludes) {
            if(str.startsWith(exclude, idx)) {
                idx += exclude.length;
                match = true;
                break;
            }
        }

        if(!match) {
            len++;
            idx++;
        }
    }

    return str.substring(0, idx);
}
这被称为:

const data = `it to make a type specimen book. <br>\r\n<br>\r\nIt has survived not only five centuries, but also the leap into electronic typesetting, <br>\r\n<br>\r\nremaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages<br>\r\n<br>\r\n, and more recently with desktop publishing software like Aldus PageMaker including&nbsp; versions of Lorem Ipsum.`;

const result = substringWithExcludes(data, ["\r", "\n", "&nbsp;", "<br>"], 100);
len跟踪字符串的长度,而idx包含这些匹配项。对于每个排除,我们需要做的是,首先查看它是否匹配,以及它是否将长度添加到idx。如果不匹配,则需要包含一个有效字符,并增加len和idx

对于较大的长度和许多排除项,可能会很慢,但它完成了任务。您可以为不区分大小写添加特定的大小写,并在必要时进行匹配。startsWith可以在需要时与正则表达式匹配进行交换。

@DILEEP,请查看下面的代码

如果你在理解代码时遇到任何问题,我会尽力回答你

/* 函数接受字符串数据 返回从索引0到默认值100的前100个字符的字符串 根据显式传递的开始和结束值返回字符串 */ 函数get100charsnoccountbrsandspacesdata,start=0,end=100{ var arr=stringtoarr,带有nobsandspacesdata 让arrSpaces=arr.mapitem=>{ 返回项目。加入“” } 让strBrsSpaces=arrSpaces.join“”;//sdd fhhf fhhf fhhf var finalStr; var SpaceScont=0; // 做{ finalStr=strbrspaces.slicestart、end+spacescont SpaceScont=finalStr.match/\s/gi.length } whilefinalStr.slicestart、end+spacescont.split''。join.length<100; 返回finalStr.slicestart,end+spacescont } /* 从字符串数据中删除和空格的函数 并返回一个2d数组,它帮助我们重新构造原始字符串 */ 函数stringToArrWithNobsandSpaceSData{ var arrNoBrs=data.split //console.logJSON.stringifyarrNoBrs,null,4 设arrNoBrsSpaces=arrNoBrs.mapitem=>{ let a=[];//let:a的局部范围 a=项目。拆分“” 返回a; } //console.logJSON.stringifyarrNoBrsSpaces,null,4 返回arrNoBrsSpaces } /* 函数,用于从2数组重建字符串 在适当的位置添加空格和空格 */ 函数arrhithnobsandspacestostringarray{ 让arrSpaces=array.mapitem=>{ 返回项目。加入“” } console.logarrspace //console.logarrspace 让strbspaces=arrSpaces.join 返回strbspace } //*******测试:StringToArrSwithNobsandSpaces var inputStr=`它可以用来制作一本类型样本书。它不仅存活了五个世纪,而且还跨越到电子排版,基本上保持不变。它在20世纪60年代随着包含Lorem Ipsum段落的Letraset表单的发布而流行,最近随着Aldus PageMaker等桌面出版软件的发布,包括Lorem Ipsum版本` var arr=stringtoarwithnobsandspacesinputstr console.logarr 控制台。日志“\n” //*******测试:与nobsandspacestostring对齐 var str=arrhithnobsandspacestostringarr console.logstr //*******测试:Get100CharsNoCountBr和SpaceSinPutstr var finalData=get100charsNoCountBrsAndSpacesinputStr console.log'finalData:',finalData console.log'Length:',finalData.Length//122 100个字符+22个空格,请参见下一行 console.log“空格数:”,finalData.match/\s/ig.length console.log“字符数:”,finalData.split“”。join.length//100 /*…**输出:StringToArrSwithNobsandSpacesInputStr**。。。 [ [ 信息技术 到 制作 A. 类型 样品 书 ], [ ], [ 信息技术 有 幸存下来的, 不 只有 五 世纪,, 但是 而且 这个 跳 进入 电子的 排版,, ], [ ], [ 剩下的 基本上, 不变。, 信息技术 是 普及,, 在里面 这个 20世纪60年代, 具有 这个 释放 属于 莱特拉塞特, 被单, 包含, 洛勒姆, 乱数假文, 通道 ], [ ], [ ,, 和 更多 不久前 具有 桌面 出版,, 软件 喜欢 奥尔德斯, 寻呼机, 包括…在内 版本, 属于 洛勒姆, 乱数假文。 ] ] */ /*…**输出:arrhithnobsandspacestostringarr**。。。 制作一本活字样书是很困难的。它不仅存活了五个世纪,而且还跨越到电子排版,基本上保持不变。它在20世纪60年代随着包含Lorem Ipsum段落的Letraset表单的发布而流行,最近随着Aldus PageMaker等桌面出版软件的发布,包括Lorem Ipsum版本。 */ /*…**输出:Get100CharsNoCountBr和SpaceSinPutstr**。。。 制作一本活字样书是很困难的。它不仅存活了五个世纪,而且还跨越到电子排版,基本上保持不变。它在20世纪60年代随着包含Lorem Ipsum段落的Letraset表单的发布而流行,最近随着Aldus PageMaker等桌面出版软件的发布,包括Lorem Ipsum版本。 最终数据:制作一本样本书是非常必要的。它不仅存活了五个世纪,而且还跨越了电子排版, 长度:122 空间数:22 字符数:100
*/为什么不能只使用一个简单的regexp?另外,如果您有转义字符,如\,该怎么办?这些将不会被视为转义,并将与您的正则表达式匹配。@ChatterOne我得到的字符串来自ajax响应,因此我无法编辑该字符串。@ChatterOne我需要以相同的对齐方式显示数据,但我需要通过不计算br和nbspYes来将字符限制为100,我理解您的要求,我问您为什么不能使用不同的regexp?