Как считать символы в текстовой области, содержащей теги - PullRequest
2 голосов
/ 17 декабря 2010

Я хочу иметь возможность подсчитать количество символов в текстовой области и сообщить клиенту, когда у них закончились символы. Я сделал это очень хорошо, но теперь мне нужно добавить еще несколько функций, и я забыл, с чего начать.

Как правило, наряду с обычными символами клиент сможет добавлять теги в текстовое поле с помощью кнопки (это уже сделано). Tagg вставляется в контент в следующем формате:

некоторый случайный контент [тег] с большим количеством контента

Я хочу иметь возможность измерить количество символов, и, где бы ни был [тег], добавьте 20 символов к общему количеству. Также необходимо удалить дополнительные символы, когда [тег] или часть [тега] удалены.

У меня работает базовая версия, но при удалении тега она не отображается.

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 = текстовая область totalTags = Счетчик для каждого нажатия кнопки тега и вставки тега.

Надеюсь, кто-то может помочь, так как это мешает моему шведу.

Приветствия

Dave

1 Ответ

4 голосов
/ 17 декабря 2010

Интересный вопрос. Вероятно, я бы обработал это с помощью регулярных выражений, а не счетчика тегов:

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) возвращает ноль, если совпадений не найдено, поэтому мы ИЛИ сделаем это с пустым массивом и будем использовать длину matches в наших вычислениях.

Человек. Я проигрываю при кодировании. : -D

...