如何使用javascript匹配和删除空白html标记?

如何使用javascript匹配和删除空白html标记?,javascript,regex,dom,ckeditor,Javascript,Regex,Dom,Ckeditor,我需要从HTML字符串中去掉空白标记。我所说的标记是指任何包含实体或字符的空HTML元素,这些实体或字符将在web浏览器中呈现为空白。比如说 <p>&nbsp;&zwnj;</p>Test <div> </div><br/><span> okay </span> …应该成为 Test <span> okay </span> 关键是要从DOM中删除不可见或只会添加额外换

我需要从HTML字符串中去掉空白标记。我所说的标记是指任何包含实体或字符的空HTML元素,这些实体或字符将在web浏览器中呈现为空白。比如说

<p>&nbsp;&zwnj;</p>Test <div>  </div><br/><span> okay </span>
…应该成为

Test <span> okay </span>
关键是要从DOM中删除不可见或只会添加额外换行符的元素

这将解决我在支持在线编辑器时遇到的一个问题,用户可以从Word中剪切粘贴内容。有时剪贴板会抓取不完整的元素。例如,结束p标记。当粘贴到编辑器中时,不完整的元素将通过插入打开的p标记来修复。这时,我有机会应用正则表达式和DOM操作来清理这些异常有问题的元素。Jquery是我唯一可以利用的库。

/|&zwnj|\s+|/g帮了我的忙:

设str='&zwnj

测试正常'; 设regex=/|&zwnj|\s+|/g; console.logstr.replaceregex /|&zwnj|\s+|/g帮了我的忙:

设str='&zwnj

测试正常'; 设regex=/|&zwnj|\s+|/g;
console.logstr.replaceregex 给你一个想法:循环检查DOM中的所有元素,看看它们的innerHtml或innerText是否为空白,如下所示:

var all = document.getElementsByTagName("*");
for (var i=0, max=all.length; i < max; i++) {
    if(all[i].innerHTML == "" || all[i].innerText == ""){           
        all[i].parentElement.removeChild(all[i]);
    };
}

给你一个想法:循环检查DOM中的所有元素,看看它们的innerHtml或innerText是否为空白,如下所示:

var all = document.getElementsByTagName("*");
for (var i=0, max=all.length; i < max; i++) {
    if(all[i].innerHTML == "" || all[i].innerText == ""){           
        all[i].parentElement.removeChild(all[i]);
    };
}

下面是一个递归解决方案,它应该删除正文中的所有空标记

var body = document.getElementsByTagName('body')[0];

function removeEmptyChildren(node){
  let children = node.children;
  for(var i = 0; i < children.length; i++){
    if(children[i].children){
      removeEmptyChildren(children[i]);
    }
    if(!children[i].textContent.trim().length){
      node.removeChild(children[i]);
      i--;
    }
  }
}

removeEmptyChildren(body);

下面是一个递归解决方案,它应该删除正文中的所有空标记

var body = document.getElementsByTagName('body')[0];

function removeEmptyChildren(node){
  let children = node.children;
  for(var i = 0; i < children.length; i++){
    if(children[i].children){
      removeEmptyChildren(children[i]);
    }
    if(!children[i].textContent.trim().length){
      node.removeChild(children[i]);
      i--;
    }
  }
}

removeEmptyChildren(body);

如果不支持投票的人能够体面地发表意见,我将不胜感激。try/|\s+|/g edited如果不支持投票的人能够体面地发表意见,我将不胜感激。try/|\s+|/g edited这很好,它适用于我的小例子,但我没有列举所有的可能性。我将尝试编辑我的问题。刚才看到了您的编辑,因为我没有收到编辑通知,并进行了编辑。这很好,它适用于我的小示例,但我没有列举所有的可能性。我将尝试编辑我的问题。我刚刚看到了你的编辑,因为我没有收到编辑通知,并进行了编辑。我尝试了一些类似的方法。一个退步是表现。由于用户积极参与剪切粘贴操作,因此任何延迟都非常明显。对于大型操作,用户可能在迭代完成之前就已经开始输入了。我已经尝试过类似的方法。一个退步是表现。由于用户积极参与剪切粘贴操作,因此任何延迟都非常明显。对于大型操作,用户可能在迭代完成之前已经开始键入。