2017-07-04 132 views
0

我試圖讓英文字母,數字值只有下列字符:正則表達式字母數字和一些某些特殊字符

- # $ % & * () [ ] , ./- _ +

我設法想出下面的代碼

<form id="accountForm" action=""> 
    <input type="text" name="my_input"> 
</form> 

$(function() { 

    $.validator.addMethod("accept", function(value, element, param) { 
     return value.match(new RegExp("." + param + "$")); 
    }, 'Only English is allowed');   


    $("#accountForm").validate({ 
     rules: { 
      my_input : { 
       required: true, 
       accept: '[[email protected]%#&()/+*$,._\\-]+$' 
      }    

     } 
    }); 
}); 

但也存在一些問題:

  1. 如果我嘗試添加[ ]代碼完全停止工作
  2. 如果我添加其他字符或不在上面的列表中,在任何字母后它不顯示任何錯誤消息。例如:ABC你好
  3. 如果我輸入一個字母,它會給出一個錯誤。

這裏是我的代碼演示:https://jsfiddle.net/w2p1rdbd/1/

能否請你告訴我怎麼解決這個問題?

非常感謝!

+1

爲什麼你要在accept方法中操作正則表達式('new RegExp(「。」+ param +「$」)')?您將以'。[a-zA-Z0-9 @%#&()/+*$,._\--] + $$'作爲正則表達式。我在你的例子中刪除了'.'和'$',添加了'^'並且它似乎正在工作。 [檢查此](https://jsfiddle.net/w2p1rdbd/2/)。 – ClasG

回答

1

我看不到在accept方法中操縱正則表達式的任何需要。 (new RegExp("." + param + "$"))。這將使你的正則表達式像.[[email protected]%#&()/+*$,._\\-]+$$一樣。

並且該行的開頭應以^(匹配字符串的開頭)爲起點禁止外來字符。

我在你的榜樣刪除.$,增加了^「原創」的正則表達式(與^[[email protected]%#&()/+*$,._\\-]+$結束了),它似乎是工作。

您的代碼修改:

$(function() { 
 

 
     $.validator.addMethod("accept", function(value, element, param) { 
 
      return value.match(new RegExp(param)); 
 
     }, 'Only English is allowed');   
 
     
 
     
 
     $("#accountForm").validate({ 
 
      rules: { 
 
       my_input : { 
 
        required: true, 
 
        accept: '^[[email protected]%#&()/+*$,._\\-]+$' 
 
       } 
 
      } 
 
     }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.16.0/jquery.validate.min.js"></script> 
 

 
<form id="accountForm" action=""> 
 
<input type="text" name="my_input"> 
 
</form>

1

首先,請注意,JavaScript有一個正則表達式類型,所以正則表達式可以指定爲一個語言元素不需要指定作爲一個字符串,它可以爲您節省一些轉義序列,並且您的語法突出顯示可以幫助您更好地進行操作。

然後你正在做THIS_

"." + param + "$" 

這將改變你的正則表達式。點意味着任何類別的附加字符在開始處匹配。因此,單個角色根本不會匹配,您需要匹配字符,第二個字符必須是您指定的類。然後在最後附加$。你的原始表情中也有這個角色:'[[email protected]%#&()/+*$,._\\-]+$',所以現在你已經得到了兩次。但其中一個被忽略,所以雖然這沒有幫助,但這並沒有什麼壞處。可能你的意思是使用"^" + param + "$",因爲這意味着「匹配從開始(^)到結束($),但是你不應該在變量表達式和你的函數中包含這些。

然後是[]的問題。你只需要在正則表達式中轉義它們。但是你也需要爲字符串轉義它們,然後你需要爲字符串轉義正則表達式轉義序列。所以很多逃跑。還要注意,這適用於破折號,但只要它是[]序列的最後部分,短劃線的問題就會被忽略。所以最後你的正則表達式需要是"^[[email protected]%#&()/+*$,._\\-\\[\\]]+$"。 (開放[的轉義是可選的)

但是,如果您使用文字,那麼您可以只寫/^[[email protected]%#&()/+*$,._\-\[\]]+$/,這是較少的轉義序列。總的來說,結果如下:

$(function() { 
    $.validator.addMethod("accept", function(value, element, param) { 
     return param.test(value); 
    }, 'Only English is allowed');   


    $("#accountForm").validate({ 
     rules: { 
      my_input : { 
       required: true, 
       accept: /^[[email protected]%#&()/+*$,._\-\[\]]+$/ 
      } 
     } 
    }); 
}); 
相關問題