Как обнаружить разрывы строк в области ввода текста?

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 был немного скучным, поэтому я искал несколько лучших решений. Спасибо за все предложения.

 Jashwant08 июн. 2012 г., 16:45
@ Дэйв Хей,Edit есть причина, не используйтеanswer раздел, чтобы добавить больше деталей :)
 Dave Haigh08 июн. 2012 г., 16:47
@ Jashwant, это не лишние детали, это ответ на мой вопрос ... поэтому я считаю, что разместил его в нужном месте.
 Dave Haigh08 июн. 2012 г., 17:12
Я не закаленный, я просто не согласен с вами.
 Dave Haigh08 июн. 2012 г., 17:00
@Jashwant может ответить не было попыткой, поскольку это действительно работает. Я намеренно оставил это вне вопроса, так как не хотел влиять на любые другие ответы. Мой вопрос поставлен как «как»; не "есть лучший способ". Нет ничего плохого в том, чтобы задать вопрос, на который у вас уже есть рабочий ответ, на самом деле это «обычно». поощряются.
 gdoron08 июн. 2012 г., 16:15
\n ..........

Ответы на вопрос(4)

Решение Вопроса

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

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

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

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

 10 дек. 2014 г., 10:18
спасибо за аккуратный выразительный кодwith explantion
 Dave Haigh08 июн. 2012 г., 16:30
это прекрасно работает, спасибо.
 02 июн. 2016 г., 21:44
это будет работать на Linux, Macintosh и Windows?
 23 июн. 2015 г., 10:12
спасибо за ваш ответ, но мне интересно, что будет, если пользовательский ввод\n сами? может быть, они просто хотят выразить эту строку. Этот способ заменит\n строка на следующую строку?
 03 июн. 2016 г., 12:38
Да, это будет. Javascript на самом деле не зависит от ОС, он только разнится в разных браузерах, и в этом ответе нет ничего, что не сработало бы вплоть до IE6.

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);

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

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

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

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

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

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

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

Ваш ответ на вопрос