Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Knockout Regex validation

I am using Knockout.validation to validate my input fields in my page. At first, everything is going well until I tried to use regex. I really don't know what it is that I'm doing wrong, hope you can help me out.

Below is my script:

var self = this;
self.MobileNumber = ko.observable().extend({ pattern: { params: "^(?:04\d{2}|\({1}04\d{2}\){1})\s{0,1}(\d{3}(\s{0,1})\d{3})$", message: "Invalid mobile number."} });

And below is my HTML page:

<div>
    <input data-bind="value: MobileNumber, valueUpdate: 'blur'" />
</div>
<div>
    <p data-bind="validationMessage: MobileNumber">
    </p>
</div>
like image 322
Lemuel Nitor Avatar asked Mar 18 '26 10:03

Lemuel Nitor


2 Answers

The regex needs to be declared as a regex rather than a string, so instead of your line above I'd use

self.MobileNumber = ko.observable().extend({ 
    pattern: { 
        params: /^(?:04\d{2}|\({1}04\d{2}\){1})\s{0,1}(\d{3}(\s{0,1})\d{3})$/, 
        message: "Invalid mobile number."
    } 
});

In my own code I habitually set up an object of regex patterns to make it easy to reuse across my app...

var patterns = {
    email: /^([\d\w-\.]+@([\d\w-]+\.)+[\w]{2,4})?$/,
    phone: /^\d[\d -]*\d$/,
    postcode: /^([a-zA-Z]{1,2}[0-9][0-9]?[a-zA-Z\s]?\s*[0-9][a-zA-Z]{2,2})|(GIR 0AA)$/
};

Then my ko looks like...

self.postcode = ko.observable().extend({
     required: true,
     pattern: {
         message: 'Must be a valid UK postcode',
         params: patterns.postcode
     }
});
like image 61
Brian Lowe Avatar answered Mar 21 '26 18:03

Brian Lowe


Please note if you're providing an object for pattern that you MUST include a message.

The regex can either be a string or a Regex literal.

However: If you're entering a pure string don't forget to escape any backslashes '^\\d{5}(?:[-\\s]\\d{4})?$' instead of '^\d{5}(?:[-\s]\d{4})?$'

self.postcode = ko.observable().extend({
     required: true,
     pattern: {
         message: 'Must be a valid UK postcode',
         params: patterns.postcode
     }
});

The follow doesn't work, and leads to bizarre behavior (I think it is actually trying to match against the toString() value of the pattern parameter which gives very strange results).

self.postcode = ko.observable().extend({
     required: true,
     pattern: {
         params: patterns.postcode
     }
});

Alternatively you can just provide the pattern directly

self.postcode = ko.observable().extend({
     required: true,
     pattern:  patterns.postcode
});
like image 39
Simon_Weaver Avatar answered Mar 21 '26 16:03

Simon_Weaver



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!