2011-01-01 9 views
8

Io uso 2 metodi per verificare che l'utente non sta entrando in troppi caratteri in una textarea:textarea da JavaScript e PHP

1) (passiva) di PHP:

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

2) (active-Whyle battitura) 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) 
} 

E textarea in sé è la seguente (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> 

Entrambi i metodi funzionano, tranne la funzione PHP strlen() sembra contare i ritorni (interruzioni di riga) in modo diverso rispetto alla mia funzione Javascript.

Qualcuno sa come risolvere questo, in modo che entrambi contano gli stessi caratteri #, indipendentemente interruzioni di riga & spazi, ecc

Grazie mille!

+0

fissare il codice in modo che sia leggibile. aggiungi quattro spazi – sethvargo

+0

puoi usare il pulsante di esempio del codice ('()') per formattare il tuo codice. – LittleBobbyTables

+2

@ seth.vargo, @LittleBobbyTables - codice ora leggibile – RLJ

risposta

3

È necessario prima convertire le interruzioni di riga. In JavaScript, un'interruzione di riga è un singolo carattere di nuova riga. Quando viene inviato, ce ne sono due. Puoi normalizzarli:

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

E quindi puoi contare la lunghezza della textarea.

+0

Grazie! è fantastico. – RLJ

0

Avete cita la magia in PHP? Prova a chiamare get_magic_quotes_gpc().

In questo caso, tutti i dati testuali inviati al server tramite GET o POST vengono sfuggiti con barre. Questo rende caratteri come ", ', \, $, caratteri della nuova riga da rappresentare con una combinazione di due caratteri: \ e il carattere originale o in caso di ritorno a capo \ r \ n.

Per utilizzarlo sul server possono filtrare i dati in questo modo:.

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 

Spero che questo aiuta Ivan

1

JavaScript rappresenta tipicamente interruzioni di riga con solo il carattere di nuova riga (ad esempio/n), mentre nel browser stesso, piuttosto che il/r/n coppia, tuttavia, al momento dell'invio è represented by /r/n pair (a.k.a. "CR LF") per the HTML 4.01 specification.

A seconda del modo in cui si sceglie di contare le interruzioni di riga, è possibile "standardizzare" la stringa lato client (ad es. fare le interruzioni di riga contano come due caratteri; se vuoi che le coppie/r/n gestite) o sul lato server (ad esempio, fai in modo che contenga come un carattere se non ti interessa gestire le coppie/r/n).

La mia scelta personale sarebbe gestirla in modo che il/r/n sia conservato poiché le interruzioni di riga sono typically represented with these characters in most systems. Tuttavia, ho potuto vedere la logica nel rappresentare un'interruzione di riga come "un carattere" per l'utente finale poiché si tratta di un singolo tasto.

1

@RLJ: Ecco un altro metodo che impedisce all'utente di immettere più testo della lunghezza massima con JavaScript e se JavaScript è disattivato, PHP stamperà il messaggio di errore se ci sono troppi caratteri.Si tratta di uno script di esempio che ho fatto con la funzione JavaScript che uso (file di salvataggio come 4575150.php sul localhost e test):

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