如何计算包含标签的textarea中的字符

时间:2010-12-17 15:44:54

标签: jquery tags character counter

我希望能够计算textarea中的字符数,并在客户用完字符时向客户报告。我做得很好,但现在我需要添加更多的功能,我迷失在哪里开始。

基本上,除了普通字符外,客户还可以通过按钮向文本框添加标签(已经完成)。标签以下列格式插入到内容中:

一些含有更多内容的随机内容[标签]

我希望能够测量字符的数量以及[tag]出现的位置,总共添加20个字符。当删除[tag]或[tag]的一部分时,它也会删除其他字符。

我的基本版本有效,但无法确定何时删除标记。

function countCharacters(totalTags){

    var new_length = $('#t_text').val().length;
    if (new_length < 10){
        totalTags=0;    
    }
    additionalcharacters = totalTags*10;
    var new_length = $("#t_text").val().length+additionalcharacters;
    if(new_length <= 154) {
        $('#charlimitinfo').removeClass('red');
        $('.cost').html('1');
    } else if(new_length >= 154 && new_length <= 308) {
        $('#charlimitinfo').removeClass('red');
        $('.cost').html('2');
    } else if(new_length >= 308 && new_length <= 462) {
        $('#charlimitinfo').removeClass('red');
        $('.cost').html('3');
    } else if(new_length >= 462 && new_length <= 606) {
        $('#charlimitinfo').removeClass('red');
        $('.cost').html('4');
    } else if(new_length >= 606 && new_length <= 616) {
        $('#charlimitinfo').addClass('red');
        $('.cost').html('5');
    }         
    else {
        if(new_length >= 616){
            $('#t_text').next('#charlimitinfo').addClass('red');
            $('#charlimitinfo').html('You have reached 616 characters!');
            this.value = this.value.substring(0, 616);
            return false;
        }
        else{
            $('#charlimitinfo').removeClass('red');
            $('#charlimitinfo').html((616 - new_length) +'<span>characters left</span>');
            return true;
        }
    }
    $('#charlimitinfo').html(new_length);  
}

t_text = textarea totalTags =每次单击标签按钮并插入标签时的计数器。

希望有人可以提供帮助,因为这可以解决我的问题。

干杯

戴夫

1 个答案:

答案 0 :(得分:4)

有趣的问题。我可能用正则表达式处理它,而不是使用标记计数器:

function countCharacters()
{
    var text = $('#t_text').val(),
        tags = ['tag', 'tag2'], // An array of your tags
        i,
        matches,
        regex,
        extraCharacters = 0,
        totalCharacters;

    for (i = 0; i < tags.length; i++)
    {
        regex = new RegExp('\\[' + tags[i] + '\\]', 'g');
        matches = text.match(regex) || [];
        extraCharacters += (matches.length * 20) - (matches.length * (tags[i].length + 2));
    }

    totalCharacters = text.length + extraCharacters;

    // Do your if statements/style changes/etc. here
}

这有几个假设:

  • 每个标签的价值为20个字符(如帖子中所述,但代码表示10个字符)
  • 标记替换为 20个字符
  • 标签实际上在你的文字中(我不明白为什么不会这样)

这个解决方案的一大优势是,如果有人手动插入标签,这将抓住它,而标签计数器则不会。

修改

代码未经测试,正则表达式可能是贪婪的(首先匹配最长的匹配)。现在测试。

修改2

好的,代码严重错误。弄清楚它是什么。

编辑3

当用字符串制作正则表达式时,你必须双重转义特殊字符:new RegExp('\\[' + tags[i] + '\\]', 'g') - 一次用于字符串,一次用于正则表达式。此外,如果未找到匹配项,string.matches(regex)将返回null,因此我们将其与空数组进行OR运算,并在计算中使用matches的长度。

曼。我输了编码。 :-D