How do you evaluate two regular expressions within the same function? - updated! - javascript

For example, I want to test a postcode is valid so I test the postcode using my regular expressions in a 'if else' scenario and call the function when the form is submitted.
function validatePostal(postalCode)
var re = new RegExp(/^([a-zA-Z]{2})([0-9]{1,2})[ ]([0-9]{2})([a-zA-Z]{1,2})$/);
var re2 = new RegExp(/^([cC]{1})([aA]{1})(2|18|17)[ ]([0-9]{2})([a-zA-Z]{1,2})$/);
var str = shipPostalCode.value;
if (re.test(str))
{
return true;
}
else if (re2.test(str))
{
return true;
alert("Congratulations!!");
}
else
{
alert("That is not a valid postcode. Please verify your input. Format should be AA11 11AA");
return false;
}
}
onclick="return (validatePostal(postalCode)"
How would i go about testing said postcode against another regular expression and then if the postcode is valid, only displaying a message to those in a particular area.
e.g. those who entered CA4 would get a message and those who entered DA4 would not?

Okay, so assuming that both re and re2 are the regular expressions for postcodes you want to accept, you could have a structure like:
if (re.test(str) || re2.test(str))
{
return true;
}
else
{
alert("That is not a valid postcode. Please verify your input. Format should be AA11 11AA");
return false;
}
Now if you want to do another check, like you said about "DA4" versus "CA4", you would have another regular expression for that (lets call it re3 to be consistent), and you could then have an inner if statement, like so:
if (re.test(str) || re2.test(str))
{
if (re3.test(str)) {
alert("You entered a CA4 postcode!");
} else {
alert("You did not enter a CA4 postcode :(.");
}
return true;
}
else
{
alert("That is not a valid postcode. Please verify your input. Format should be AA11 11AA");
return false;
}

function validatePostal(postalCode)
var re = new RegExp(/^([a-zA-Z]{2})([0-9]{1,2})[ ]([0-9]{2})([a-zA-Z]{1,2})$/);
var re2 = new RegExp(/^([cC]{1})([aA]{1})(2|18|17)[ ]([0-9]{2})([a-zA-Z]{1,2})$/);
var str = shipPostalCode.value;
var isPostalCodeValid = false;
if (re.test(str))
{
isPostalCodeValid = true;
}
else if (re2.test(str))
{
alert("Congratulations!!");
isPostalCodeValid = true;
}
if(isPostalCodeValid){
//Check for Postalcode and show mssg or not
}else{
alert("That is not a valid postcode. Please verify your input. Format should be AA11 11AA");
return false;
}
}
onclick="return (validatePostal(postalCode)"

Related

JavaScript validation not working in installshield

Requirement : To validate password and emailID entered by user.
I have designed a dialog for user to enter there email id and password for creating their new account.
I want the the user input to be validated on the "next" button of the dialog.
I have written a JavaScript for it as shown below and added a custom action in "do action" of my dialog button.
function validatePassword(str szPasswordportal)
{
var newPassword = szPasswordportal;
var minNumberofChars = 6;
var maxNumberofChars = 20;
var regularExpression = /^[A-Za-z0-9`~!#%]{6,20}$/;
alert(newPassword);
if(newPassword = "") //if null
return false;
if(newPassword.length < minNumberofChars || newPassword.length > maxNumberofChars)
{
return false;
}
if(!regularExpression.password(newPassword))
{
alert("password should contain atleast one number ,one alphabet and one special character");
return false;
}
return true;
}
But this JS is not getting executed successfully.
Can someone help me out with this or with some other suggestion?
Your if condition have a syntax mistake.
if(newPassword = "")
= is assigning operator. If you want to check the value you have to use conditional operator == like below.
if(newPassword == "")
Also you have to add all the condition on else part, then only it will check the validation one by one, otherwise at the end it will automatically return the true value. Change your script like below.
function validatePassword(str szPasswordportal)
{
var newPassword = szPasswordportal;
var minNumberofChars = 6;
var maxNumberofChars = 20;
var regularExpression = /^[A-Za-z0-9`~!#%]{6,20}$/;
alert(newPassword);
if(newPassword == "" || newPassword.length < minNumberofChars || newPassword.length > maxNumberofChars)
{
return false;
} else if(!regularExpression.password(newPassword))
{
alert("password should contain atleast one number ,one alphabet and one special character");
return false;
} else {
return true;
}
}

Validate multiple emails separated by semicolons and all must match a specific domain

I want to validate this text field email which contains Multiple emails; all separated by semi colons but this isn't working. It should break when msn.com have been entered along with other emails.
var isMsn = ["msn.com"];
function myFunction() {
var str = email.value;
//var isMsn = str.includes("msn.com");
var res = str.split(";");
var isValid = false;
//alert(res.length);
for (var i = 0; i < res.length; i++){
//alert(res[i]);
var x = res[i];
//check to see if this is an valid emAIL then
var mailformat = /^\w+([\.-]?\w+)*#\w+([\.-]?\w+)*(\.\w{2,3})+$/;
if(x.match(mailformat)){
alert("valid email address!");
//IF isMsn = TRUE then check to see if is contains msn.com
if (x.contains(isMsn) ){
alert("it is MSN");
//res[+1];
isValid = true;
}
else {
alert('no MSN');
if (res.includes(isMsn)){
//alert('Cannot mix MSN emails with other');
//isValid = false;
//res[-1];
break;
}
//else{
//alert('it is other');
//isValid = true;
//}
}
}
else{
alert("You have entered an invalid email address!");
isValid = false;
}
}
}
I want it to loop through and all the emails must either match a msn.com or other NOT Both. for example, user#msn.com;user1#msn.com or user#hotmail.com;user1#hotmail.com but NOT user#msn.com;user1#hotmail.com
Not sure if .includes is the best option or not!
1) You should use includes instead of contains;
2) The includes or contains method accepts a string, not an array, so it should be res.includes(isMsn[0]);
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes
And if you want to validate by multiple domains - you should not name it isMsn, but prohibitedDomains and then to Array.some (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some) over this array.
prohibitedDomains.some((domain) => res.includes(domain))

jQuery Validation plugin custom method using regex

I need to make a new method for jQuery Validator and don't know where to start.
I would like it check that the email entered includes: '#specificdomain.com'.
But that it is also the very last part of the input. For example #specificdomain.comChris would not do.
<script type="text/javascript">
jQuery.validator.addMethod("mustinclude", function(value, element) {
return this.optional(element) || value == ?
}, "must include #specificdomain.com at the end of the text input");
$(document).ready(function(){ .....
So far I've only come across value == value.match(), hence this is where I've got stuck.
Cheers Chris
jQuery.validator.addMethod('matchDomain', function(value, element) {
var s=value;
var split = s.split('#');
var regex = /^([a-zA-Z0-9_.+-])+$/;
var s2="#allcoles.com";
var optionalValue = this.optional(element);
if (optionalValue) {
return optionalValue;
}
if(regex.test(split[0]) && s2.equals(split[1]))
{
return true;
}
else
{
return false;
}
}, 'Please specify a #allcoles.com email');
The following worked for me:
jQuery.validator.addMethod('matchDomain', function(value, element) {
var s=value;
var split = s.split('#');
var regex = /^([a-zA-Z0-9_.+-])+$/;
**var s2="allcoles.com";** //The split array is the domain excluding the #
**var optionalValue = this.optional(element);** //This is how other methods in alternativeMethods.js Validator handle this.
**//Debugging - This is useful to see visually what is happening
//alert(split[0]); // Shows the inputted username i.e chris or smokey
//alert(split[1]); // Shows the inputted domain
//alert(regex.test(split[0])); //Shows unfilled inputs problem or bad characters, true if good, false if bad
//alert(s2 == split[1]);** // Shows if the inputted domain matches variable s2, if it does we get a true
if (optionalValue) {
return optionalValue;
}
**if(regex.test(split[0]) && (s2 == split[1]))** // has to be == not equals
{
return true;
}
else
{
return false;
}
}, 'Please specify a #allcoles.com email');
var s="abc#specificdomain.com"; OR var s=value;
var split = s.split('#');
var regex = /^([a-zA-Z0-9_.+-])/;
var s2="#specificdomain.com";
if(regex.test(split[0]) && s2 == split[1])
return true;
else
return false;

Validate email as you type

I want to validate input as I type so I use onkeyup event to do so, but if I validate an email regex "name#domain.com", as soon as user starts to type it throws an error - first character doesnt match regex...
So I wrote this:
var addValidation = function (patterns) {
var index = patterns.length; //I know I can avoid this
while (index--) {
patterns[index] = new RegExp(patterns[index]);
}
index = 0;
var current = patterns[index],
matchExact = function (patt, str) {
var match = str.match(patt);
return match !== null && str === match[0];
};
return function () {
var str = this.value;
if (!matchExact(current, str) ) {
var tmp = patterns[index + 1] ?
new RegExp(current.source + patterns[index + 1].source) :
false;
if (tmp && matchExact(tmp, str)) {
current = tmp;
index++;
}
else {
alert("Wrong");
}
}
}
};
document.getElementById("x").onkeyup = addValidation(["[a-zA-Z0-9\\.]+", "#{1}", "[a-zA-Z0-9]+", "\\.{1}", "[a-zA-Z]{1,3}"]);
It seems to work, but... it's ugly and it will alert you if you do step back (eg. "name#" and you press backspace).
I know that Dojo's validation is great, but I do not want to use Dojo. Are there any better ways to achieve that?
//EDIT: http://livedocs.dojotoolkit.org/dijit/form/ValidationTextBox this is an example, but you can define your own pattern (like email regex) and it will validate it perfectly.
Add interval before validation will start:
var t;
document.getElementById("x").onkeyup = function () {
if (t) {
clearTimeout(t);
}
t = setTimeout(function () {
//do validation
}, 1000)
}
Don't ever try to validate an email address with a regualr expression. You'll either end up allowing addresses which are not valid, or block email addresses which are perfectly valid and just annoy your visitors. It's also worth bearing in mind that the best regex so far for validating email addresses is this:
http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html

RegEx validation of html form in external .js

I am trying to validate a html form using a javascript function, but the function is never matching the values to regex even when they are correct. This is what I have:
function validateForms(form){
var usZipRegex = '^\d{5}[[$-.+ ]?\d{4}]?$|^\d{5}$';
var canZipRegex = '^[ABCEGHJKLMNPRSTVWXY][\d][ABCEGHJKLMNPRSTVWXYZ][\W]?[\d][ABCEGHJKLMNPRSTVWXYZ][\d]$';
var nameRegex = '^[A-Za-z][ -a-zA-Z]+$';
var emailRegex = '^[^\.#]([\w]*\.)*[^\.#]*#[a-zA-Z0-9-]{1,63}(\.[a-zA-Z0-9-]{1,63})+$';
var name = form.name.value;
var zip = form.zip.value;
var email = form.email.value;
var comment = form.comment.value
if(name == "") {
alert('You must enter your name.');
return false;
}
if(name != nameRegex) {
alert('You have entered an invalid name.');
return false;
}
if(email == "") {
alert('You must enter your email.');
return false;
}
if(email != emailRegex) {
alert('You have entered an invalid email.');
return false;
}
if(zip == "") {
alert('You must enter your zip code.');
return false;
}
if((zip != usZipRegex) & (zip != canZipRegex)) {
alert('You have entered an invalid zip code.');
return false;
}
if(comment == "") {
alert('You must enter a message.');
return false;
}
return true;
}
The (name != nameRegex) parts always return true, but should not. The (name == "") parts do work on their own though.
You're comparing the raw strings, not running the regex. name != nameRegex will always return true unless the person's name is literally ^[A-Za-z][ -a-zA-Z]+$. You need to set up nameRegex properly as a regex object, but in your code, it's just a string. You also need to use test or another one of the RegExp object's methods to check for a match, not the ==/!= operators. This is true for the other patterns as well.
Constructing a regex is done one of two ways:
var regex1 = /[a-z0-9]/;
var regex2 = new RegExp('[a-z0-9]');
If you do it like this, though, it's just a string:
var notARegex = '[a-z0-9]';
Your code should be closer to this style:
var nameRegex = /^[A-Za-z][-a-zA-Z ]+$/; //note that the hyphen has been moved
//...
if (!nameRegex.test(name)) {
alert('You have entered an invalid name.');
return false;
}
Edit: There's more going wrong here. Your other regex code could use some major improvements:
var usZipRegex = /^\d{5}([$.+ -]?\d{4})?$/;
var canZipRegex = /^(?![DFIOQU])[A-Y]\d(?![DFIOQU])[A-Z]\W?\d(?![DFIOQU])[A-Z]\d$/;
var nameRegex = /^[a-z][a-z\s-]+$/i;
var emailRegex = /^[^.#]+#[^.#]{1,63}(\.[^.#]{1,63})+$/i';
I don't know if your Canadian zip code pattern is correct, but the email one was definitely wrong (email is WAY more complicated than you think, so it's best to be very permissive with it).

Categories