Arhn - архитектура программирования

ограничение символов текстовой области с помощью Javascript и PHP

Я использую 2 метода, чтобы проверить, что пользователь не вводит слишком много символов в текстовое поле:

1) (пассивный) PHP:

$textarea = $_POST['textarea'];
if (strlen($textarea)>300){$verify="bad";}

2) (активный ввод текста) Javascript:

function ismaxlength(obj)
{
   var mlength=obj.getAttribute? parseInt(obj.getAttribute("maxlength")) : ""
   if (obj.getAttribute && obj.value.length>mlength)
   obj.value=obj.value.substring(0,mlength)
}

А сама текстовая область выглядит следующим образом (html):

<textarea name="textarea" id="textarea" cols="40" rows="5" style="border: 1px solid #480091; width:460px;" wrap="soft" maxlength="300" onpaste="return ismaxlength(this)" onkeyup="return ismaxlength(this)"></textarea>

Оба метода работают, за исключением того, что функция PHP strlen(), похоже, считает возвраты (разрывы строк) иначе, чем моя функция Javascript.

Кто-нибудь знает, как решить эту проблему, чтобы они оба считали одинаковые символы #, независимо от разрывов строк и пробелов и т. д.

Большое спасибо!


  • исправьте свой код, чтобы он был читабелен. добавить четыре пробела 01.01.2011
  • вы можете использовать кнопку образца кода (()) для форматирования кода. 01.01.2011
  • @seth.vargo, @LittleBobbyTables — код теперь читаем 01.01.2011

Ответы:


1

Сначала вы должны преобразовать разрывы строк. В JavaScript разрыв строки — это один символ новой строки. При отправке их два. Вы можете нормализовать их:

$textarea = $_POST['textarea'];
$textarea = str_replace("\r\n", "\n", $textarea);
$textarea = str_replace("\r", "\n", $textarea);

И тогда вы можете подсчитать длину текстовой области.

01.01.2011

2

Javascript обычно представляет разрывы строк только символом новой строки (например, /n) в самом браузере, а не парой /r/n. Однако при отправке он представлен /r/ n (иначе "CR LF") в соответствии со спецификацией HTML 4.01.

В зависимости от того, какой способ подсчета разрывов строк вы выберете, вы можете «стандартизировать» строку либо на стороне клиента (например, сделать так, чтобы разрывы строк считались двумя символами; если вы хотите, чтобы пары /r/n обрабатывались), либо на стороне сервера (например, сделать он считается одним символом, если вам не нужны пары /r/n).

Мой личный выбор состоял бы в том, чтобы обрабатывать это так, чтобы /r/n сохранялся, поскольку разрывы строк обычно представляются с помощью этих символов в большинстве систем. Тем не менее, я мог видеть логику в представлении разрыва строки как «один символ» для конечного пользователя, поскольку это одно нажатие клавиши.

01.01.2011

3

@RLJ: Вот еще один метод, который не позволяет пользователю вводить больше текста, чем максимальная длина с помощью JavaScript, и если JavaScript отключен, PHP напечатает сообщение об ошибке, если будет слишком много символов. Это пример сценария, который я сделал с помощью функции JavaScript, которую я использую (сохраните файл как 4575150.php на своем localhost и протестируйте):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>questions/4575150</title>

<script type="text/javascript">
function charsLeft(msgObj, cntObj, chrLen) {
    var frmObj   = document.getElementById(msgObj);
    var cntField = document.getElementById(cntObj);
    var maxlimit = chrLen;
    var msg      = 0;

    while (cntField.firstChild) {
        cntField.removeChild(cntField.firstChild);
    }

    if (frmObj.value.length > 0) { msg = frmObj.value.length + 0; }

    // IE counts both CR and NL, so just count for NL
    var IELength = 0;
    if (frmObj.value.length > 0 && frmObj.value.match('\r')) {
        splitL = frmObj.value.split('\n').length;
        msgL   = frmObj.value.length;

        if (splitL >= 3) {
            IELength = splitL - 1; // splitL >= 3
        } else {
            IELength = 1;
        }
        msg = msg - IELength;
    }

    if (msg > maxlimit) {
        cntField.appendChild(document.createTextNode("0 characters left"));
        var overflow = msg - maxlimit;
        var backspace = frmObj.value.length - overflow;
        if (frmObj.value.length > 0 && backspace < 0) {
            backspace = backspace * -1;
            if (frmObj.value.length < backspace) {
                overflow = frmObj.value.length;
            } else {
                overflow = backspace;
            }
        } else if (frmObj.value.length == 0 && backspace < 0) {
            overflow = 0;
        }
        frmObj.value = frmObj.value.substring(0, frmObj.value.length - overflow);
    } else {
        cntField.appendChild(document.createTextNode(maxlimit - msg + " characters left"));
    }
}
</script>

<style type="text/css">
html, body, textarea {
    font-family: arial, helvetica, sans-serif;
}
body {
    font-size: 75%;
}
label {
    display: block;
    font-weight: bold;
}
form div {
    margin: 0 0 10px 0;
}
</style>
</head>

<body>

<?php
define("chars", 15);

$request_method = strtoupper($_SERVER['REQUEST_METHOD']);

if ($request_method == "POST")
{
    $text = $_POST['text'];

    if (strlen($text) > chars)
    {
        echo "<p><b>Error:</b> Too many characters! There ";
        echo "should be " . chars . ", you've entered ";
        echo abs(chars - strlen($text)) . " too many</p>";
    }
}
?>

<form action="4575150.php" method="post">
    <div>
        <label for="text">Text:</label>
        <textarea name="text" id="text" style="width: 97%" class="resizable" cols="40" rows="3" onkeydown="charsLeft(this.id, this.id + '_left', <?php echo chars; ?>)" onkeyup="charsLeft(this.id, this.id + '_left', <?php echo chars; ?>)" onkeypress="charsLeft(this.id, this.id + '_left', <?php echo chars; ?>)" onchange="charsLeft(this.id, this.id + '_left', <?php echo chars; ?>)" onfocus="charsLeft(this.id, this.id + '_left', <?php echo chars; ?>)" onblur="charsLeft(this.id, this.id + '_left', <?php echo chars; ?>)"><?php echo $text; ?></textarea>
        <div id="text_left"><span><?php echo chars - strlen($text); ?> characters left</span></div>
    </div>
    <div>
        <input type="submit" value="Submit" />
    </div>
</form>

</body>
</html>
01.01.2011

4

У вас есть магическое цитирование в php? Попробуйте вызвать get_magic_quotes_gpc().

Если вы это сделаете, то все текстовые данные, отправляемые на сервер через GET или POST, будут экранированы косой чертой. Это делает такие символы, как ", ', \, $, символы новой строки, которые будут представлены комбинацией двух символов: \ и исходного символа или в случае возврата каретки \r\n.

Чтобы использовать его на сервере, вы можете фильтровать данные следующим образом:

function unslash($string){
    if(get_magic_quotes_gpc()){
        return stripslashes($string);
    }
    return $string; // no need to unslash
}

$textarea = unslash($_POST['textarea']);
// the rest of your code

Надеюсь, это поможет. Иван

01.01.2011
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..