Avatar of joao_c
joao_c
Flag for Portugal asked on

Complex Regular Expression for a form validation

I have this form that validates with jquery & regular expressions...

...
//some code

var characterReg = /^([a-zA-Z0-9]{2,50})$/; //only letters and numbers

if ( !characterReg.test(inputValName) ){

			result.text('that\'s not a valid name!');

...
//more code

Open in new window


Now, I need a very specific validation of a field called 'NIF', wich is the identifier of a tax-paying company in my country. And I need some help to make a regular expression to use like I did in the above code.

So I found an old javascript code online that validates 'NIF':

function IsValidNIF(nif)
{
    var c;
    var checkDigit = 0;
    //Check if is not null, is numeric and if has 9 numbers
    if(nif != null && IsNumeric(nif) && nif.length == 9)
    {
        //Get the first number of NIF
        c = nif.charAt(0);
        //Check firt number is (1, 2, 5, 6, 8 or 9)
        if(c == ‘1' || c == ‘2' || c == ‘5' || c == ‘6' || c == ‘8' || c == ‘9')
        {
            //Perform CheckDigit calculations
            checkDigit = c * 9;
            var i = 0;
            for(i = 2; i <= 8; i++)
            {
                checkDigit += nif.charAt(i-1) * (10-i);
            }
            checkDigit = 11 - (checkDigit % 11);
            //if checkDigit is higher than ten set it to zero
            if(checkDigit >= 10)
                checkDigit = 0;
            //Compare checkDigit with the last number of NIF
            //If equal the NIF is Valid.            
            if(checkDigit == nif.charAt(8))
                return true;            
        }        
    }
    return false;
}

function IsNumeric(ObjVal)
{
return /^\d+$/.test(ObjVal);
}

Open in new window


So, is it possible to make a regular expression from this?

The rules are:

-must be only numbers
-must be 9 characters(numbers) long
-the first number must be 1 or 2 or 5 or 6 or 8 or 9
-the last number performs some validation(%module) that you should understand viewing the above code

Thank you.
JavaScriptScripting LanguagesjQuery

Avatar of undefined
Last Comment
joao_c

8/22/2022 - Mon
ozo

-must be only numbers
-must be 9 characters(numbers) long
-the first number must be 1 or 2 or 5 or 6 or 8 or 9
 characterReg = /^[125689][0-9]{8}$/

-the last number performs some validation(%module) that you should understand viewing the above code
This part would produce a more complicated regular expression than is worth it, so I'd stick to using code.
joao_c

ASKER
What you mean " ...I'd stick to using code." ?

If possible let me know "how" complicated would the regex become. I don't mind if the regex is not "readable", the aproach of regex is just to cut some lines of code. Unless the regex could have some performance/other issues,. is that the case?

Thanks a lot.
kaufmed

I have to agree with ozo:  You're going to be attempting to reproduce modulo arithmetic via a regex. This isn't really what regex is designed for. The code approach would be much simpler. Just use ozo's suggested pattern, then add logic for the modulo check.
Experts Exchange is like having an extremely knowledgeable team sitting and waiting for your call. Couldn't do my job half as well as I do without it!
James Murphy
joao_c

ASKER
Thanks kaufed.

Then how would I add up the 2 things (regex + code) in my form?

Should be like:

...
//some code

var myRegex = /^[125689][0-9]{8}$/;

if ( myRegex.test(inputValName) ){

			// then implement other if here with the modulo% code??

...
//more code

Open in new window

leakim971

What about :
String.prototype.ozo = function(i) { return this.charAt(i-1) * (10-i); }
function IsValidNIF(nif) {
	var checkDigit = 0;
	for(var i=1;i<9;i++) checkDigit += nif.ozo(i);
	return /^[125689][0-9]{8}$/.test(nif) && ((checkDigit%11 >= 21)?0:checkDigit == nif.charAt(8));
}

Open in new window

joao_c

ASKER
Thanks for the reply leakim971.

That's a little scary for my modest understanding of jquery.

Where do I put that code in the current code I have??

	<script>


	function clearInput() {
		$("#myForm :input").each( function() {
			$(this).val('');
		});
	};



	$("#submitBtn").click( function() {


		var result = $('#result');
		var company = $('#myForm > #name-of-company');
		var ai = $('#myForm > #annual-income');
		var characterReg = /^([a-zA-Z0-9]{2,50})$/; //only letters and numbers
		var aiReg = /^([0-9]{3,15})$/; //only numbers
		var inputVal = ai.val();
		var inputValName = company.val();

		if ( !characterReg.test(inputValName) ){

			result.text('that\'s not a valid name!');
			company.addClass('wrong');
			

		} else if ( !aiReg.test(inputVal) ) {

			result.text('only numbers!');
			ai.addClass('wrong');
			company.removeClass('wrong');



		} else {

			$.post( $("#myForm").attr("action"), 
			$("#myForm :input").serializeArray(), 
			function(info){ result.html(info);
			});
			clearInput();
			company.removeClass('wrong');
			ai.removeClass('wrong');

		};


	});



	$("#myForm").submit( function() {
		return false;	
	});



	</script>

Open in new window

⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
leakim971

There's no query here. You need to replace your current function by the one provided
joao_c

ASKER
but i a working with jquery here, I am more familiar with with. Don't know how to manipulate the DOM with pure js. Can I incorporate that function in my jquery?

Thanks
leakim971

just replace your previous one, no more no less...
All of life is about relationships, and EE has made a viirtual community a real community. It lifts everyone's boat
William Peck
ASKER CERTIFIED SOLUTION
kaufmed

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
joao_c

ASKER
Thank you, it works great.