我想计算一个字符串中的字符数,我从div标签中拉出这样的字符:
$(".welcome-msg").html().length;
然而,它将HTML注释计为标记内的字符。因此,当我希望结果为0时,由于这些注释我得到99,而且我没有办法告诉评论是否是动态的。是否有一种简单的方法可以确保评论不计算在内?或者我必须为此编写正则表达式吗?
谢谢,
答案 0 :(得分:4)
您可以过滤评论,但这并不容易。我将向您展示如何在第一级过滤它们,这很容易,但如果它们嵌套在其他标记中,那么您需要执行其他逻辑。
关键是.contents()
获取其中的所有节点。这包括注释节点。然后,您可以通过对nodeType进行组合来过滤注释节点。
所以它会是这样的:
$(".welcome-msg").contents().filter(function() {
return this.nodeType != 8;
}).appendTo("<div>").parent().html();
这适用于
<div class=".welcome-msg">
<!--Comment --><span>hello</span>
</div>
但不适用于
<div class=".welcome-msg">
<span><!--Comment -->hello </span> world
</div>
您需要递归地遍历所有标记,然后它将适用于所有标记。
使用正则表达式时,您需要注意<script>
标记和<style>
标记。
以下是jsfiddle
递归地执行它实际上非常简单:
为它制作了一个完整的插件:
$.fn.removeComments = function() {
this.contents().filter(function() {
return this.nodeType == 8;
}).remove();
this.children().each(function() {
$(this).removeComments();
});
return this;
};
console.log($(".welcome-msg").clone().removeComments().html());
答案 1 :(得分:3)
var myhtml = $(".welcome-msg").html();
myhtml = myhtml.replace(/<!--.*?-->/sg, "");
myhtml.length();
来自这里的正则表达式StackOverflow: Remove HTML comments with Regex, in Javascript