2011-01-01 16 views
8

utilizo 2 métodos para comprobar que el usuario no entra en demasiados caracteres en un área de texto:área de texto de carácter límite de Javascript y PHP

1) (pasivo) PHP:

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

2) (Active typing-Whyle) 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) 
} 

Y la propia área de texto es el siguiente (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> 

Ambos métodos funcionan, excepto que la función PHP strlen() parece contar los retornos (saltos de línea) de manera diferente que mi función de Javascript.

¿Alguien sabe cómo resolver esto, por lo que ambos cuentan los mismos caracteres #, independientemente de los saltos de línea & espacios, etc.

Muchas gracias!

+0

arreglar su código para que sea legible. agregue cuatro espacios – sethvargo

+0

puede usar el botón de muestra de código ('()') para formatear su código. – LittleBobbyTables

+2

@ seth.vargo, @LittleBobbyTables - código ahora legible – RLJ

Respuesta

3

Primero debe convertir los saltos de línea. En JavaScript, un salto de línea es un solo carácter de nueva línea. Cuando se envía, hay dos. Puede normalizarlos:

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

Y luego puede contar la longitud del área de texto.

+0

¡Gracias! eso es genial. – RLJ

0

¿Tiene citas mágicas en php? Intenta llamar a get_magic_quotes_gpc().

Si lo hace, entonces todos los datos de texto enviados al servidor a través de GET o POST se escapan con barras. Esto hace que los caracteres como ", ', \, $, nuevos caracteres de línea se representen mediante la combinación de dos caracteres: \ y el carácter original o en el caso de retorno de carro \ r \ n.

Para usarlo en el servidor puede filtrar los datos de la siguiente manera:.

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 

espero que esto ayude a Ivan

1

Javascript representa típicamente saltos de línea con sólo el carácter de nueva línea (por ejemplo,/n), mientras que en el propio navegador en lugar de la/r/n pair. Sin embargo, al enviarlo es represented by /r/n pair (a.k.a. "CR LF") per the HTML 4.01 specification.

Según la forma en que elija contar los saltos de línea, puede "estandarizar" la cadena en cada lado del cliente (p. Ej. hacer que los saltos de línea cuenten como dos caracteres; si desea que se manejen los pares/r/n) o del lado del servidor (por ejemplo, haga que cuente como un carácter si no le importa manejar para los pares/r/n).

Mi elección personal sería manejarlo para que se preserve/r/n, ya que los saltos de línea son typically represented with these characters in most systems. Sin embargo, pude ver la lógica en la representación de un salto de línea como "un personaje" para el usuario final, ya que es una sola pulsación de tecla.

1

@RLJ: Aquí hay otro método que evita que el usuario ingrese más texto que la longitud máxima con JavaScript y si JavaScript está desactivado, PHP imprimirá el mensaje de error en caso de que haya demasiados caracteres.Este es un script de ejemplo que hice con la función de JavaScript que utilizo (guardar archivo como 4575150.php en su localhost y la prueba):

<!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> 
Cuestiones relacionadas