2011-01-01 41 views
8

tôi sử dụng 2 phương pháp để kiểm tra xem người dùng không vào quá nhiều ký tự trong một textarea:textarea bằng Javascript & PHP

1) (passive) PHP:

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

2) (gõ active-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) 
} 

Và textarea chính nó là như sau (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> 

Cả hai phương thức đều hoạt động, ngoại trừ hàm strlen() của PHP có vẻ như đếm trả về (ngắt dòng) khác với hàm Javascript của tôi.

Có ai biết làm thế nào để giải quyết này, vì vậy mà cả hai đều đếm # nhân vật tương tự, bất kể ngắt dòng & không gian vv

Cảm ơn rất nhiều!

+0

sửa mã của bạn để nó có thể đọc được. thêm bốn dấu cách – sethvargo

+0

bạn có thể sử dụng nút mẫu mã ('()') để định dạng mã của bạn. – LittleBobbyTables

+2

@ seth.vargo, @LittleBobbyTables - mã có thể đọc được – RLJ

Trả lời

3

Trước tiên, bạn phải chuyển đổi ngắt dòng. Trong JavaScript, ngắt dòng là một ký tự dòng mới. Khi nó được gửi đi, có hai. Bạn có thể bình thường hóa chúng:

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

Và sau đó bạn có thể đếm chiều dài của vùng văn bản.

+0

Cảm ơn! thật tuyệt. – RLJ

0

Bạn có trích dẫn phép thuật trong php không? Thử gọi get_magic_quotes_gpc().

Nếu bạn làm như vậy, thì mọi dữ liệu văn bản gửi đến máy chủ qua GET hoặc POST sẽ được thoát bằng dấu gạch chéo. Điều này làm cho các ký tự như ", ', \, $, ký tự dòng mới được biểu diễn bằng kết hợp hai ký tự: \ và ký tự gốc hoặc trong trường hợp trả về \ r \ n.

Để sử dụng nó trên máy chủ, bạn có thể lọc dữ liệu như thế này:.

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 

tôi hy vọng điều này sẽ giúp Ivan

1

Javascript thường đại diện cho ngắt dòng chỉ với các ký tự dòng mới (ví dụ/n) trong khi trong trình duyệt riêng của mình chứ không phải là/r Cặp/n Tuy nhiên, khi gửi nó là represented by /r/n pair (a.k.a. "CR LF") per the HTML 4.01 specification.

Tùy thuộc vào cách bạn chọn để đếm các ngắt dòng, bạn có thể "chuẩn hóa" chuỗi phía khách hàng (ví dụ: làm cho các ngắt dòng được tính là hai ký tự; nếu bạn muốn các cặp/r/n được xử lý) hoặc phía máy chủ (ví dụ: làm cho nó được tính là một ký tự nếu bạn không quan tâm để xử lý cho cặp/r/n).

Lựa chọn cá nhân của tôi sẽ là xử lý nó để/r/n được giữ nguyên kể từ khi ngắt dòng là typically represented with these characters in most systems. Tuy nhiên, tôi có thể thấy logic biểu diễn ngắt dòng là "một ký tự" cho người dùng cuối vì nó là một phím tắt duy nhất.

1

@RLJ: Đây là một phương pháp ngăn người dùng nhập văn bản nhiều hơn độ dài tối đa với JavaScript và nếu JavaScript tắt, PHP sẽ in thông báo lỗi nếu có quá nhiều ký tự.Đây là một kịch bản mẫu tôi thực hiện với các hàm JavaScript tôi sử dụng (lưu file như 4575150.php trên localhost của bạn và kiểm tra):

<!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> 
Các vấn đề liên quan