Интересный вопрос. Вероятно, я бы обработал это с помощью регулярных выражений, а не счетчика тегов:
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