【问题标题】:Validate user input for extra long words in textarea验证文本区域中超长单词的用户输入
【发布时间】:2013-04-25 11:00:44
【问题描述】:

我在验证用户在 textarea 中的输入时遇到问题。 假设用户在表单的文本区域字段之一中输入他的描述。但是有些人只是放了诸如“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 之类的随机文本以绕过最小长度要求。

现在我想阻止用户输入这么长的文本而没有任何空格,因为它会破坏我页面的 UI。 用户输入的没有任何空格的长文本也可以是有效的 url。那么我该如何管理这个&只有当文本太长并且不是有效的 url 时才会向用户抛出错误以更正文本??

PS:我不想自己拆分字符串。我只想检测它并在客户端验证时向用户抛出错误。只是为了结束一些疑问,我将进行服务器端验证,在该验证中我将强行输入一个空间并将其保存在数据库中。但我希望在客户端解决这个问题

【问题讨论】:

  • 你确定你正在解决一个真正的问题吗?有多少用户真正在做这件事?这真的很重要吗?尝试使用带有溢出省略号的 CSS。
  • 我强烈建议你不要使用客户端输入过滤,这是非常糟糕的做法,很容易被绕过。
  • @JimmyvanBeele,为什么在客户端验证输入是不好的做法?
  • @DerekHenderson 因为如果有人在使用 Tor 自带的 NoScript,而且它也是 Firefox 的一个广泛使用的插件,验证将不起作用,因此问题仍然存在。这对整体安全性也不利,因为您让人们试图在客户端阻止 SQL 注入。
  • @JimmyvanBeele,如果有人在使用 JS,而您在服务器端进行了所有验证,那么您已经进行了不必要的服务器调用!良好的做法是在客户端和服务器端进行验证。

标签: javascript jquery jquery-validate validation


【解决方案1】:
var STRING_MAX_LENGTH = 10;

var description = 'aaa aaaaaaaaaa bbbbbbbbbb http://www.google.com/search?q=client-side-filtering';
var array = description.split( ' ' );

$.each( array, function() {
  if ( this.length >= STRING_MAX_LENGTH ) {
    if( /^([a-z]([a-z]|\d|\+|-|\.)*):(\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?((\[(|(v[\da-f]{1,}\.(([a-z]|\d|-|\.|_|~)|[!\$&'\(\)\*\+,;=]|:)+))\])|((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=])*)(:\d*)?)(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*|(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)){0})(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i . test( this ) ) {
      alert( this + ' is an URL' );
    } else {
      alert( this + ' is not an URL' );
    }
  }
});

http://jsfiddle.net/vVYAp/

【讨论】:

    【解决方案2】:
    function validate()
    {
      var expression = /[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi;
      var wordLengthExpr = /\b[^\s]{50,}\b/;
      var regex = new RegExp(expression);
      var wordLengthRegex = new RegExp(wordLengthExpr);
      var t = $("#myTextarea").val();
      if (t.match(regex) ||  !t.match(wordLengthRegex))
      {
        //valid
      }
      else
      {
        //throw error
      }
    }
    

    【讨论】:

    • 嗨@MMeersseman。你能解释一下你的正则表达式吗?我试过了,但即使我输入“aa”或“ab”任何合法的东西,它也会给我错误
    • 我再次编辑了我的帖子,我犯了一个错误。它现在应该可以工作了。基本上,您搜索包含 10 个或更多非空白字符的单词。如果您仍然有问题,请告诉我。您可以将“10”更改为您认为适合您需要的任何内容。
    • 我试过了,但它仍然会在 textarea 中输入一个字母时引发错误。我在 keyup 事件上调用函数验证
    • 在 wordLengthExpr 中,您正在检查 minlength 是否为 10。但我们谈论的是不带空格的最大长度。我的意思是当用户输入包含 50 个字符且它们之间没有空格的字符串时抛出错误50 个字符不是 URL
    • 改变这个:t.match(wordLengthRegex) 到这个:!t.match(wordLengthRegex)
    【解决方案3】:

    这是一个两步过程:

    1. 确定是否有任何单词太长。
    2. 如果是,请确定它们是否是有效的 URL。
    var validateWordLength = function (str) {
        var maxLength = 50,  // or whatever max length you want
            reURL = /^(ftp|http|https):\/\/[^\s]+$/, // use whatever regular expression for URL matching you feel best
            words = str.split(/\s+/),
            i;
    
        for (i = 0; i < words.length; i += 1) {
            if (words[i].length > maxLength) {
                // test for url
                // but bear in mind the answer at http://stackoverflow.com/questions/1410311/regular-expression-for-url-validation-in-javascript
                // testing for url may not be fruitful
                if (!reURL.test(words[i])) {
                    return false;
                }
            }
        }
    
        return true;
    };
    

    【讨论】:

    • 您的代码看起来不错,但是如果 words 数组有 3 个值并且如果第二个值设置有效 = false,并且第三个值再次设置有效 = true,那么在每个函数之后,将返回有效 = true不应该……我说的对吗?
    • 没问题..但是我得到了奇怪的错误:(我想放弃这个验证的东西:(因为当我在每个函数中写 return false 时,netbeans 显示错误说'匿名函数并不总是返回一个值' :( 要求太多了,但如果您可以在带有 textarea 的 jsfiddle 上展示一个工作演示,那就太好了
    • @Jigar,请记住我没有定义reURL,这很可能是您遇到错误的原因。您必须提供 RE 才能使其正常工作。如果你愿意,我可以放一个。
    • 或者更好的是,我会亲自展示我的表现:) 给我一些时间
    • @Jigar,愚蠢的错误来自我,而不是你。 ;) 编辑后的代码现在可以工作了。
    【解决方案4】:

    试试这个

        var value = Your text;
    
        var result = value.replace(" ","");
    
    if(value.length == result .length)
      //not valid
    else
     //valid
    

    【讨论】:

      【解决方案5】:

      你可以得到每个单词的长度,然后可以决定是否允许用户 -

      var arr = text.split(' ');
      
      $.each(arr,function(){
         console.log(this.length);
         // check valid word length
      }); 
      

      http://jsfiddle.net/mohammadAdil/cNZtn/

      【讨论】:

        【解决方案6】:

        如果你使用jQuery validate plugin,你可以给它添加一个方法:

        jQuery.validator.addMethod("samechars", function(value, element) { 
            return this.optional(element) ||  !/([a-z\d])\1\1/i.test(value); 
        }, "Invalid input");
        

        【讨论】:

          【解决方案7】:

          如果你想使用 jQuery,你可以使用以下:

          $("form").submit(function(e){
          var $textarea = $('#msg'),
              maxWordLength = 20;
          
                      var value = $textarea.val().split(' '),
                          longWord = false;
          
                      for(var n = 0; n < value.length; n++) {
                          if(value[n].length >= maxWordLength)
                              longWord = true;
                      }
          
          if(longWord) {
              alert('Too long word');
              return false;
          }
          });
          

          这是一个小提琴: http://jsfiddle.net/pJgyu/31286/

          【讨论】:

          • 当然这也可以只用 javascript 编写,我在一个 jquery 项目中有这个函数,所以这是我在那个项目中的代码。
          猜你喜欢
          • 1970-01-01
          • 2019-04-04
          • 2014-10-05
          • 2017-11-25
          • 1970-01-01
          • 1970-01-01
          • 2015-06-08
          • 2016-08-29
          • 2015-03-19
          相关资源
          最近更新 更多