Вопрос по javascript, jquery, line-breaks, special-characters – Как обнаружить разрывы строк в области ввода текста?

38

What is the best way to check the text area value for line breaks and then calculate the number of occurrences, if any?

У меня есть текстовая область на форме на моей веб-странице. Я использую JavaScript, чтобы получить значение текстовой области, а затем проверяю его длину.

Example
enteredText = textareaVariableName.val();
characterCount = enteredText.length; // One line break entered returns 1

Если пользователь вводит разрыв строки в текстовой области, мои вычисления выше дают разрыв строки длиной 1. Однако мне нужно задать разрывы строки длиной 2. Поэтому мне нужно проверить разрывы строк и количество вхождений, а затем добавить это на общую длину.

Example of what I want to achieve
enteredText = textareaVariableName.val();
characterCount = enteredText.length + numberOfLineBreaks;

Мое решение, прежде чем задавать этот вопрос, было следующее:

enteredText = textareaVariableName.val();
enteredTextEncoded = escape(enteredText);
linebreaks = enteredTextEncoded.match(/%0A/g);
(linebreaks != null) ? numberOfLineBreaks = linebreaks.length : numberOfLineBreaks = 0;

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

\n .......... gdoron
@ Jashwant, это не лишние детали, это ответ на мой вопрос ... поэтому я считаю, что разместил его в нужном месте. Dave Haigh
@ Дэйв Хей,Edit есть причина, не используйтеanswer раздел, чтобы добавить больше деталей :) Jashwant
Я не закаленный, я просто не согласен с вами. Dave Haigh
@Jashwant может ответить не было попыткой, поскольку это действительно работает. Я намеренно оставил это вне вопроса, так как не хотел влиять на любые другие ответы. Мой вопрос поставлен как «как»; не "есть лучший способ". Нет ничего плохого в том, чтобы задать вопрос, на который у вас уже есть рабочий ответ, на самом деле это «обычно». поощряются. Dave Haigh

Ваш Ответ

4   ответа
4

var inTxt = document.getElementById('txtAreaId').value;
var charCount = inTxt.length + inTxt.match(/\n/gm).length;

где/\n/ соответствует разрывам строк (очевидно),g это глобальный флаг.m расшифровывается как многострочный, который вам, очевидно, нужен в этом случае ...
В качестве альтернативы, хотя, насколько я помню, это немного медленнее:

var charCount = inTxt.length + (inTxt.split("\n").length);

Edit Только что понял, что, если нет совпадений между строками, это приведет к ошибке, поэтому лучше сделать:

charCount = intTxt.length + (inTxt.match(/\n/) !== null ? inTxt.match(/\n/gm).length : 0);

Или что-то подобное ...

Я только что осознал свою ошибку, редактировал мой ответ :)
Если нет разрывов строк,match вернусьnullтак что доступlength выдаст ошибку.
2

encodeURI(), так какescape() не рекомендуется в ECMAScript 1.5.

Вместо этого используйте:
enteredText = textareaVariableName.val(); enteredTextEncoded = encodeURI(enteredText); linebreaks = enteredTextEncoded.match(/%0A/g); (linebreaks != null) ? numberOfLineBreaks = linebreaks.length : numberOfLineBreaks = 0;

3

var count = text.length + text.replace(/[^\n]/g, '').length;

В качестве альтернативы, вы можете заменить все "голые"\n персонажи с\r\n а затем используйте общую длину.

это прекрасно работает, спасибо. Dave Haigh
Элиас: Я думаю, что он фактически заменяет все, что не является символом разрыва строки, ничем, а затем подсчитывает длину оставшегося символа, который будет просто разрывом строки. Довольно умно!
это удвоит количествоexcept разрывы строк, и только для символов до первого разрыва строки. с точностью до наоборот вопроса OP, если я не ошибаюсь.
62

match на строке, содержащей разрывы строк, а количество элементов в этом массиве должно соответствовать количеству разрывов строк.

enteredText = textareaVariableName.val();
numberOfLineBreaks = (enteredText.match(/\n/g)||[]).length;
characterCount = enteredText.length + numberOfLineBreaks;

/\n/g является регулярным выражением, означающим «искать символ»\n (разрыв строки), и сделать это глобально (через всю строку).

||[] часть на случай, если нет разрывов строк. Матч вернетсяnullпоэтому мы проверяем длину пустого массива, чтобы избежать ошибок.

это прекрасно работает, спасибо. Dave Haigh
спасибо за ваш ответ, но мне интересно, что будет, если пользовательский ввод\n сами? может быть, они просто хотят выразить эту строку. Этот способ заменит\n строка на следующую строку?
спасибо за аккуратный выразительный кодwith explantion
Да, это будет. Javascript на самом деле не зависит от ОС, он только разнится в разных браузерах, и в этом ответе нет ничего, что не сработало бы вплоть до IE6.
это будет работать на Linux, Macintosh и Windows?

Похожие вопросы