ограничение символов textarea на Javascript и PHP
Я использую 2 метода, чтобы проверить, что пользователь не вводит слишком много символов в textarea:
1) (пассивный) PHP:
$textarea = $_POST['textarea'];
if (strlen($textarea)>300){$verify="bad";}
2) (active-whyle typing) 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.
кто-нибудь знает как решить эту проблему, так что они оба подсчитывают одинаковые символы#, независимо от разрывов строк и пробелов и т. д.
Спасибо большое!
4 ответов
сначала нужно преобразовать разрывы строк. В JavaScript строки один символ новой строки. Когда его посылают, их двое. Их можно нормализовать:
$textarea = $_POST['textarea'];
$textarea = str_replace("\r\n", "\n", $textarea);
$textarea = str_replace("\r", "\n", $textarea);
и затем вы можете подсчитать длину textarea.
Javascript обычно представляет разрывы строк только с новым символом строки (например, /n), а в самом браузере, а не с парой /r/N. Однако при подаче это представлен парой /r/n (a.к. a. "CR LF") в спецификации HTML 4.01.
в зависимости от того, каким образом вы решите подсчитать разрывы строк, вы можете "стандартизировать" строку на стороне клиента (например, сделать разрывы строк двумя символами; если вы хотите, чтобы пары /r/n обрабатывались) или на стороне сервера (например, сделайте его одним символом, если вы не хотите обрабатывать пары /r/n).
мой личный выбор будет обрабатывать его так, чтобы /r/n сохранялся, так как разрывы строк обычно представлены с этими символами в большинстве систем. Однако я мог видеть логику в представлении разрыва строки как "одного символа" для конечного пользователя, поскольку это одно нажатие клавиши.
@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>
у вас есть магия цитирования на 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
надеюсь, это поможет. Иван!--2-->