计算字符串中的字符数但想跳过评论

时间:2012-04-09 16:27:10

标签: jquery

我想计算一个字符串中的字符数,我从div标签中拉出这样的字符:

$(".welcome-msg").html().length;

然而,它将HTML注释计为标记内的字符。因此,当我希望结果为0时,由于这些注释我得到99,而且我没有办法告诉评论是否是动态的。是否有一种简单的方法可以确保评论不计算在内?或者我必须为此编写正则表达式吗?

谢谢,

2 个答案:

答案 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

更新(递归过滤器)

递归地执行它实际上非常简单:

http://jsfiddle.net/xYR5p/3/

为它制作了一个完整的插件:

$.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