Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Подсчет "реальной" длины текста в textarea (https://javascript.ru/forum/dom-window/9760-podschet-realnojj-dliny-teksta-v-textarea.html)

modernx 04.06.2010 13:38

Подсчет "реальной" длины текста в textarea
 
1) В БД хранится описание некоторого объекта, размер поля ограничен, предположим, 1000 символов.
2) В форме пытаюсь осуществить предварительную валидацию по длине текста в TEXTAREA с помощью JS (document.form.info.value.length)

Переносы строк в Chrome подсчитываются как 1 символ, в IE - как 2 символа. В php-скрипт же (метод POST) передается реальная строка, в которой переносы выглядят как "\r\n" (4 символа).

Вопрос: Подскажите новичку, как правильно подсчитать с помощью JS дину текста в textarea, которую получит php-скрипт. Спасибо!

Gvozd 04.06.2010 15:06

Цитата:

Сообщение от modernx
переносы выглядят как "\r\n" (4 символа).

это два символа

micscr 04.06.2010 16:16

Вот этому значению
document.form.info.value.length

можете доверять.
Разница в том какие символы какой браузер вставляет чтобы обозначить конец строки. IE вставляет \r\n, а Chrome - только \n. Но эти же символы в php и уйдут.

p.s. jQuery метод val() стандартизирует этот разнобой - удаляет \r

modernx 04.06.2010 16:51

Цитата:

Сообщение от Gvozd
переносы выглядят как "\r\n" (4 символа).
это два символа

посчитайте вручную, если не верите :) Строка передается как она есть:
Код
echo $_POST['info'];
echo "(".strlen(utf8_decode($_POST['info'])).")"; return;

Выдает: 1\r\n\r\n(9)

Цитата:

Сообщение от micscr
jQuery метод val() стандартизирует этот разнобой - удаляет \r

Это лишь часть решения, которая реализует кроссбраузерность подсчета на стороне клиента. В любом случае, серверный скрипт получает свои "\r\n" хоть их хрома, хоть из ие (пробовал вот так даже сделать перед отправкой $('#tinfo').val($('#tinfo').val());)

Kolyaj 04.06.2010 17:16

Цитата:

Сообщение от modernx
Выдает: 1\r\n\r\n(9)

stripslashes не забыли?

micscr 04.06.2010 17:27

Цитата:

Сообщение от modernx (Сообщение 57874)
посчитайте вручную, если не верите :)

А зачем мне верить? Я знаю, что
echo strlen("\r\n");
выведет 2
Цитата:

Сообщение от modernx (Сообщение 57874)
Строка передается как она есть:
Код
echo $_POST['info'];
echo "(".strlen(utf8_decode($_POST['info'])).")"; return;
Выдает: 1\r\n\r\n(9)

а вот то что приходят данные искаженные наводит на мысль о например включенных magic_quotes.
Kolyaj, выше подсказал, что нужно лишнее экранирование убрать.

modernx 04.06.2010 17:29

Цитата:

Сообщение от Kolyaj
stripslashes не забыли?

чтобы на выходе получить 1rnrn ? Зачем?

modernx 04.06.2010 17:31

Цитата:

Сообщение от micscr
а вот то что приходят данные искаженные наводит на мысль о например включенных magic_quotes.

Вот такой код у меня в шапке:
function slashes(&$el)
{
if (is_array($el))
foreach($el as $k=>$v)
slashes($el[$k]);
else $el = stripslashes($el);
}

if (ini_get('magic_quotes_gpc'))
{
slashes($_GET);
slashes($_POST);
slashes($_COOKIE);
}

micscr 04.06.2010 17:41

А ты проверь - включены ли у тебя и выполняется ли
if (ini_get('magic_quotes_gpc'))
{
 // этот код
}


потому что я вообще проверяю так:
if (get_magic_quotes_gpc()) {
...
}


Цитата:

чтобы на выходе получить 1rnrn ? Зачем?
Ты введешь
w
r

И получишь:
w
r

если просмотреть исходный код страницы

modernx 04.06.2010 17:41

В общем, пока организовал такой подсчет, вроде работает:

temptext = $('#tinfo').val();
   count = 0;
   pos = temptext.indexOf("\n");
   while ( pos != -1 ) {
   count+=3;
   pos = temptext.indexOf("\n",pos+1);
   }
   document.iform.counter.value= $('#tinfo').val().length + count;

Kolyaj 04.06.2010 20:24

Цитата:

Сообщение от modernx
чтобы на выходе получить 1rnrn ? Зачем?

Сейчас у тебя выводится вот такая строка '\\r\\n', а надо '\n\r'.

modernx 04.06.2010 21:09

Цитата:

Сообщение от Kolyaj (Сообщение 57903)
Сейчас у тебя выводится вот такая строка '\\r\\n', а надо '\n\r'.

В общем, я просто тупанул: забыл про mysql_escape_string, который мне и прописал эти коды :)

Всем спасибо! :thanks:

e1f 04.06.2010 21:11

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
    <title>Character count test</title>

    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <meta name="generator" content="Geany 0.18.1.1" />

    <style type="text/css">
    #report {
      white-space: -moz-pre-wrap; /* Mozilla, supported since 1999 */
      white-space: -pre-wrap; /* Opera 4 - 6 */
      white-space: -o-pre-wrap; /* Opera 7 */
      white-space: pre-wrap; /* CSS3 - Text module (Candidate Recommendation) http://www.w3.org/TR/css3-text/#white-space */
      word-wrap: break-word; /* IE 5.5+ */
    }
    </style>

    <script type="text/javascript">
    function count_symbols() {
        var val = document.getElementById('counter').value,
            len = val.replace(/\r\n/g, '\n').length;

        document.getElementById('report').
            appendChild(document.createTextNode(len + '\n'));
    }
    </script>
</head>

<body>
<p><textarea id="counter" rows="5" cols="20">это
просто
тест</textarea></p>
<p><button onclick="count_symbols()">Count</button></p>
<p id="report"></p>
</body>
</html>

Какой идиот придумал виндовые переводы строк...

modernx 04.06.2010 21:28

Цитата:

Сообщение от e1f (Сообщение 57907)
Какой идиот придумал виндовые переводы строк...

Да, подытожив, могу лишь отметить, что в любом случае в php придет 2 символа "\r\n", а подобный скрипт подсчитает лишь 1, следовательно, надо подсчитывать количество вхождений "\n" (при удаленных "\r") и увеличивать счетчик на это количество.

Хмм... А вот как из Линуксового браузера уйдёт такой текст весьма интересно...

B~Vladi 05.06.2010 00:58

Цитата:

Сообщение от e1f
Какой идиот придумал виндовые переводы строк...

Переводы строк они и в африке... Кто в винду засунул возврат коретки?! Вот это вопрос.

micscr 05.06.2010 08:39

Цитата:

Сообщение от modernx (Сообщение 57908)
Да, подытожив, могу лишь отметить, что в любом случае в php придет 2 символа "\r\n", а подобный скрипт подсчитает лишь 1, следовательно, надо подсчитывать количество вхождений "\n" (при удаленных "\r") и увеличивать счетчик на это количество.

можно еще в php просто удалить из строки "\r".

Gvozd 05.06.2010 10:52

Цитата:

Сообщение от B~Vladi
Переводы строк они и в африке... Кто в винду засунул возврат коретки?! Вот это вопрос.

тогда, вопрос, кто убрал из макОси перевод строки, оставив но его месте возврат каретки?;)

B~Vladi 05.06.2010 12:06

Кто на что горазд:)

e1f 05.06.2010 12:29

Эх, еще бы в BolgenOS реализовали \n\r, для полноты ощущений :)

subzey 05.06.2010 21:03

\x00\n, чтобы уж совсем экстремально.

PeaceCoder 06.06.2010 00:31

Цитата:

Сообщение от B~Vladi
ереводы строк они и в африке... Кто в винду засунул возврат коретки?! Вот это вопрос.

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

B~Vladi 06.06.2010 00:41

Цитата:

Сообщение от PeaceCoder
Вообщето это все пошло с печатной машинки.

Спасибо, мы в курсе чо такое возврат коретки. С появлением компов, это стало не актуально (если логически рассуждать), поэтому я и запостил своё мнение (оказывается я не один такой).

e1f 06.06.2010 18:30

Цитата:

Сообщение от PeaceCoder (Сообщение 58051)
Вообщето это все пошло с печатной машинки. кто не знает, там можно печатать не возвращая карретку, а можно печатать на тойже строке просто вернув карретку но не перейдя на новую строку...
А т.к. в компьютере возврат корректки не актуален, то в юниксах решили его убрать.

Спасибо, Кэп :) Но тут вопрос скорее всего не в этом. Вопрос в том, зачем же было делать так, что последовательность из 2х байт интерпретируется в Винде как 1 символ, причем в однобайтных кодировках? Слишком уж странная дань традиции...


Часовой пояс GMT +3, время: 23:08.