SlideShare a Scribd company logo
Validating Forms
(AND MORE)
WITH THE

HTML5 Pattern
Attribute

@cliener
HTML5 RECAP

http://wufoo.com/html5/
Before I get stuck into patterns, I’ll quickly go through some of the important parts of HTML5 forms. If you want to play along at
home, have a look at Wufoo’s HTML Forms guide.
HTML5 RECAP
<input	
  type="email">

Most of the new input types come with awesome custom keyboards for iOS and more recent Android (amongst others). Some
browser versions offer basic validation in but inconsistent implementations mean they can’t be relied upon.
The key new inputs types are “email”,
HTML5 RECAP
<input	
  type="tel">

“tel”,
HTML5 RECAP
<input	
  type="url">

“url” and
HTML5 RECAP
<input	
  type="number">

“number”.
HTML5 RECAP
<input	
  type="datetime">

Unfortunately “datetime”, “time” and “year” input types have been marked as “in danger” by the W3C due to poor and
inconsistent browser support. There’s something of a chicken and egg situation when it comes to standards and browser
support. Unfortunately for the HTML5 date and time inputs,
the chicken looks something like this.
HTML5 RECAP
<input	
  required>

Important attributes to note are “required”,
HTML5 RECAP
<input	
  placeholder=
	
  	
  	
  	
  	
  	
  	
  "dd/mm/yyyy">

“placeholder”
PATTERNS
<input	
  pattern="/d*">

and, of course, “pattern”. Patterns allow you to provide a regular expression string primarily for input validation. A numeric
regulation expression like the this one can trigger a numeric keyboard. You’ll often see the above pattern as “[0-9]*” because
most people don’t know how to write regular expressions to save themselves.
NOW YOU HAVE TWO PROBLEMS

http://evolt.org/node/36435
I can’t remember the origin so I’ll call it an old saying: “You have a problem which can be solved with a regular expression. Now
you have two problems.”
I won’t pretend regular expressions are the easiest to write however a good guide the one on Evolt will certainly make life easier
for you.
PATTERNS
/d*/
.test("12345");
>>>	
  true

I find the JS console (in a browser near you) are a handy way to test out regular expressions. This one matches any numeric value
PATTERNS
/d*/
.test("Once	
  I	
  caught	
  a
	
  	
  	
  	
  	
  	
  	
  fish	
  alive");
>>>	
  false

And correctly returns false to a string.
POSTCODE
/d{4}/
.test("605");
>>>	
  false

Australian postcodes are easily matched with this pattern - exactly four digits - returning false here for “605”
POSTCODE
/d{4}/
.test("6050");
>>>	
  true

and true here for a correct value.
YEAR
/d{4}|d{2}/
.test("13");
>>>	
  true

Getting slightly more complex with a pipe which acts as an “or” switch, we can match either two or four digit years.
TIME
/(([0-­‐1]d)|(2[0-­‐3]))
:[0-­‐5]d/
.test("08:37");
>>>	
  true

Square brackets specify a range of values, round brackets group sub-expressions together: here matching a twenty hour time
value.
TIME
/(([0-­‐1]?d)|(2[0-­‐3]))
(:|.)[0-­‐5]d/
.test("8.37");
>>>	
  true

With a slight modification, we’re now matching a wider range of natural inputs.
DATE
/d{2}/d{2}/d{4}/
.test("24/10/2013");
>>>	
  true

Dates seem fairly straight-forward
DATE
/d{2}/d{2}/d{4}/
.test("99/99/9999");
>>>	
  true

but are a lot more complex than they seem.
DATE
/(?=d)(?:(?:31(?!.(?:0?[2469]|11))|(?:
30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-­‐9]|
[2-­‐9]d)?(?:0[48]|[2468][048]|[13579]
[26])|(?:(?:16|[2468][048]|[3579]
[26])00)))(?:x20|$))|(?:2[0-­‐8]|1d|0?
[1-­‐9]))([-­‐/])(?:1[012]|0?[1-­‐9])1(?:
1[6-­‐9]|[2-­‐9]d)?dd(?:(?=x20d)x20|
$))?/
.test("99/99/9999");
>>>	
  false
A bit more work and we end up with this.
At this point I can understand if you’re a little shocked, so I’ll pull it back a little.
EMAIL
/w+@w+.w+/
.test("a@b.c")
>>>	
  true

Email addresses are often something of a mine field but, on the surface, the pattern is fairly simple: “a@b.c”
EMAIL
/w+@w+.w+/
.test("cli+ner@
	
  	
  	
  	
  	
  	
  	
  	
  	
  server.com.au");
>>>	
  true

Already we’re matching better than most email validation rules out there.
EMAIL
/w+@w+.w+/
.test("1337@server.com");
>>>	
  true

Except the simplicity soon gets us unstuck when we get false positives. Given how scary date validation was, it’s tempting to see
what Google has to offer
EMAIL
/(?:(?:rn)?[	
  t])*(?:(?:(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[	
  t]))*"(?:(?:rn)?[	
  t])*)
(?:.(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[	
  t]))*"(?:(?:rn)?
[	
  t])*))*@(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[	
  t])*)(?:.(?:(?:r
n)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[	
  t])*))*|(?:[^()<>@,;:".[]	
  000-­‐
031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[	
  t]))*"(?:(?:rn)?[	
  t])*)*<(?:(?:rn)?[	
  t])*(?:@(?:[^()<>@,;:".[]	
  000-­‐
031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[	
  t])*)(?:.(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:r
n)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[	
  t])*))*(?:,@(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?
=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[	
  t])*)(?:.(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".
[]]))|[([^[]r]|.)*](?:(?:rn)?[	
  t])*))*)*:(?:(?:rn)?[	
  t])*)?(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r
]|.|(?:(?:rn)?[	
  t]))*"(?:(?:rn)?[	
  t])*)(?:.(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r
]|.|(?:(?:rn)?[	
  t]))*"(?:(?:rn)?[	
  t])*))*@(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|
.)*](?:(?:rn)?[	
  t])*)(?:.(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?
[	
  t])*))*>(?:(?:rn)?[	
  t])*)|(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[	
  t]))*"(?:(?:rn)?
[	
  t])*)*:(?:(?:rn)?[	
  t])*(?:(?:(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[	
  t]))*"(?:(?:r
n)?[	
  t])*)(?:.(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[	
  t]))*"(?:(?:r
n)?[	
  t])*))*@(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[	
  t])*)(?:.(?:
(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[	
  t])*))*|(?:[^()<>@,;:".[]	
  
000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[	
  t]))*"(?:(?:rn)?[	
  t])*)*<(?:(?:rn)?[	
  t])*(?:@(?:[^()<>@,;:".[]	
  
000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[	
  t])*)(?:.(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:
(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[	
  t])*))*(?:,@(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|
Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[	
  t])*)(?:.(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:
".[]]))|[([^[]r]|.)*](?:(?:rn)?[	
  t])*))*)*:(?:(?:rn)?[	
  t])*)?(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^
"r]|.|(?:(?:rn)?[	
  t]))*"(?:(?:rn)?[	
  t])*)(?:.(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^
"r]|.|(?:(?:rn)?[	
  t]))*"(?:(?:rn)?[	
  t])*))*@(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]
r]|.)*](?:(?:rn)?[	
  t])*)(?:.(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:
rn)?[	
  t])*))*>(?:(?:rn)?[	
  t])*)(?:,s*(?:(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?
[	
  t]))*"(?:(?:rn)?[	
  t])*)(?:.(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?
[	
  t]))*"(?:(?:rn)?[	
  t])*))*@(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?
[	
  t])*)(?:.(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[	
  t])*))*|(?:
[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[	
  t]))*"(?:(?:rn)?[	
  t])*)*<(?:(?:rn)?[	
  t])*(?:@(?:
[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[	
  t])*)(?:.(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  
000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[	
  t])*))*(?:,@(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:
(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[	
  t])*)(?:.(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|
Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[	
  t])*))*)*:(?:(?:rn)?[	
  t])*)?(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[
["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[	
  t]))*"(?:(?:rn)?[	
  t])*)(?:.(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[
["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[	
  t]))*"(?:(?:rn)?[	
  t])*))*@(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[
["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[	
  t])*)(?:.(?:(?:rn)?[	
  t])*(?:[^()<>@,;:".[]	
  000-­‐031]+(?:(?:(?:rn)?[	
  t])+|Z|(?=[["()<>@,;:".
[]]))|[([^[]r]|.)*](?:(?:rn)?[	
  t])*))*>(?:(?:rn)?[	
  t])*))*)?;s*)/
.test("ha@ha.ha");
>>>	
  true

http://www.codinghorror.com/blog/2005/02/regex-use-vs-regex-abuse.html
And here is 6.2KB of RFC standard-compliant email regular expression.
Which brings me to a major problem when regular expressions.
Unfortunately, a fair number of programmers out in the wild haven’t quite worked out regular expressions yet so you need to be
really careful about what you’re write.
EMAIL
/([w!#%&$'*+-­‐=?^_`{|}~]+[w!#
%&$'*+-­‐=?^_`{|}~.]+[w!#%&$'*+
-­‐=?^_`{|}~]+|[w!#%&$'*+-­‐=?
^_`{|}~]{1,2})@([A-­‐Za-­‐z0-­‐9-­‐]+.)
+[A-­‐Za-­‐z0-­‐9-­‐]+/
.test("1337@server.com");
>>>	
  false
For the record, here’s my RFC-compliant email regular expression.
SECURITY

As a whole, password validation is awful.
SECURITY

Over-validation is a great way to make people hate you
SECURITY

because, as much as you might think otherwise, you don’t know as much about them as you think you do.
SECURITY

But then there are people like, presumably, Bob.
And here be dragyns. In the last couple of years, millions of passwords - hashed and otherwise - have been grabbed from
various online services which means that everything we though we knew about password validation is, in essence, wrong. This
also means that enforced password validation is probably wrong too. So, please don’t. Invest your energy into two factor
authentication or something else that’s actually secure rather than incurring the wrath of the users who do know what they’re
doing.
CREDIT CARDS
"4123	
  5678	
  9012	
  3456"
.replace(/(s)/g,	
  "");
>>>	
  "4123567890123456"

While I’ve shown how awesome regular expressions are for pattern validation, they can also manipulate data. Right here is
everything you need to strip spaces from a credit card number so I can enter it with spaces as it is on my card. You no longer
have any excuses.
ERROR MESSAGES
<input	
  pattern="d{4}"	
  
title="Please	
  enter	
  a	
  
valid	
  postcode	
  e.g.	
  
3000">

Rather crucial when doing pattern validation is presenting a meaningful error message to users. In HTML5, browsers are abusing
the title attribute to this end. You can also set the .setCustomValidity() DOM property but title will work for most instances.
ERROR MESSAGES

The results aren’t perfect, but they’re a whole lot better than server validation.
In summary, are regular expressions better than kittens? I think the answer is definitively yes.
@cliener
http://www.slideshare.net/cliener/
FURTHER READING
HTML5 Rocks: Constraint Validation: Native Client
Side Validation for Web Forms
http://www.html5rocks.com/en/tutorials/
forms/constraintvalidation/
Ad

Recommended

Internet Explorer 8 for Developers by Christian Thilmany
Internet Explorer 8 for Developers by Christian Thilmany
Christian Thilmany
 
Beyond the Basics, Debugging with Firebug and Web Inspector
Beyond the Basics, Debugging with Firebug and Web Inspector
Steven Roussey
 
Make Your Own Damn SEO Tools (Using Google Docs!)
Make Your Own Damn SEO Tools (Using Google Docs!)
Sean Malseed
 
How not to suck at Cyber Security
How not to suck at Cyber Security
Chris Watts
 
Ajax
Ajax
wangjiaz
 
Http to Https Get your WordPress website Compliant!
Http to Https Get your WordPress website Compliant!
Lynn Dye
 
Building a social network in under 4 weeks with Serverless and GraphQL
Building a social network in under 4 weeks with Serverless and GraphQL
Yan Cui
 
Tips and tricks for building api heavy ruby on rails applications
Tips and tricks for building api heavy ruby on rails applications
Tim Cull
 
Practical JavaScript Programming - Session 6/8
Practical JavaScript Programming - Session 6/8
Wilson Su
 
/Regex makes me want to (weep|give up|(╯°□°)╯︵ ┻━┻)\.?/i
/Regex makes me want to (weep|give up|(╯°□°)╯︵ ┻━┻)\.?/i
brettflorio
 
Form validation client side
Form validation client side
Mudasir Syed
 
/Regex makes me want to (weep_give up_(╯°□°)╯︵ ┻━┻)/i (for 2024 CascadiaPHP)
/Regex makes me want to (weep_give up_(╯°□°)╯︵ ┻━┻)/i (for 2024 CascadiaPHP)
brettflorio
 
Regular expression presentation for the HUB
Regular expression presentation for the HUB
thehoagie
 
Regular expressions
Regular expressions
Raj Gupta
 
regex_presentation.pptx
regex_presentation.pptx
BeBetter4
 
Data validation in web applications
Data validation in web applications
srkirkland
 
JavaScript - Chapter 9 - TypeConversion and Regular Expressions
JavaScript - Chapter 9 - TypeConversion and Regular Expressions
WebStackAcademy
 
Regular Expressions 2007
Regular Expressions 2007
Geoffrey Dunn
 
JavaScript Regular Expression Match
JavaScript Regular Expression Match
raj upadhyay
 
Web Forms People Don't Hate
Web Forms People Don't Hate
cliener
 
HTML5 Forms OF DOOM
HTML5 Forms OF DOOM
Stephanie Hobson
 
How to check valid email? Find using regex(p?)
How to check valid email? Find using regex(p?)
Visuality
 
JSregularExpressions.pptx
JSregularExpressions.pptx
MattMarino13
 
Javascript regular expression
Javascript regular expression
Dhairya Joshi
 
3.2 javascript regex
3.2 javascript regex
Jalpesh Vasa
 
Regular expressions using Python
Regular expressions using Python
Md. Shafiuzzaman Hira
 
02. input validation module v5
02. input validation module v5
Eoin Keary
 
And Now You Have Two Problems
And Now You Have Two Problems
Luca Mearelli
 
Designing for Learning Difficulties @ Web Directions Design 2019
Designing for Learning Difficulties @ Web Directions Design 2019
cliener
 
Skeleton screens early draft for JSFoo 2017
Skeleton screens early draft for JSFoo 2017
cliener
 

More Related Content

Similar to Validating forms (and more) with the HTML5 pattern attribute (20)

Practical JavaScript Programming - Session 6/8
Practical JavaScript Programming - Session 6/8
Wilson Su
 
/Regex makes me want to (weep|give up|(╯°□°)╯︵ ┻━┻)\.?/i
/Regex makes me want to (weep|give up|(╯°□°)╯︵ ┻━┻)\.?/i
brettflorio
 
Form validation client side
Form validation client side
Mudasir Syed
 
/Regex makes me want to (weep_give up_(╯°□°)╯︵ ┻━┻)/i (for 2024 CascadiaPHP)
/Regex makes me want to (weep_give up_(╯°□°)╯︵ ┻━┻)/i (for 2024 CascadiaPHP)
brettflorio
 
Regular expression presentation for the HUB
Regular expression presentation for the HUB
thehoagie
 
Regular expressions
Regular expressions
Raj Gupta
 
regex_presentation.pptx
regex_presentation.pptx
BeBetter4
 
Data validation in web applications
Data validation in web applications
srkirkland
 
JavaScript - Chapter 9 - TypeConversion and Regular Expressions
JavaScript - Chapter 9 - TypeConversion and Regular Expressions
WebStackAcademy
 
Regular Expressions 2007
Regular Expressions 2007
Geoffrey Dunn
 
JavaScript Regular Expression Match
JavaScript Regular Expression Match
raj upadhyay
 
Web Forms People Don't Hate
Web Forms People Don't Hate
cliener
 
HTML5 Forms OF DOOM
HTML5 Forms OF DOOM
Stephanie Hobson
 
How to check valid email? Find using regex(p?)
How to check valid email? Find using regex(p?)
Visuality
 
JSregularExpressions.pptx
JSregularExpressions.pptx
MattMarino13
 
Javascript regular expression
Javascript regular expression
Dhairya Joshi
 
3.2 javascript regex
3.2 javascript regex
Jalpesh Vasa
 
Regular expressions using Python
Regular expressions using Python
Md. Shafiuzzaman Hira
 
02. input validation module v5
02. input validation module v5
Eoin Keary
 
And Now You Have Two Problems
And Now You Have Two Problems
Luca Mearelli
 
Practical JavaScript Programming - Session 6/8
Practical JavaScript Programming - Session 6/8
Wilson Su
 
/Regex makes me want to (weep|give up|(╯°□°)╯︵ ┻━┻)\.?/i
/Regex makes me want to (weep|give up|(╯°□°)╯︵ ┻━┻)\.?/i
brettflorio
 
Form validation client side
Form validation client side
Mudasir Syed
 
/Regex makes me want to (weep_give up_(╯°□°)╯︵ ┻━┻)/i (for 2024 CascadiaPHP)
/Regex makes me want to (weep_give up_(╯°□°)╯︵ ┻━┻)/i (for 2024 CascadiaPHP)
brettflorio
 
Regular expression presentation for the HUB
Regular expression presentation for the HUB
thehoagie
 
Regular expressions
Regular expressions
Raj Gupta
 
regex_presentation.pptx
regex_presentation.pptx
BeBetter4
 
Data validation in web applications
Data validation in web applications
srkirkland
 
JavaScript - Chapter 9 - TypeConversion and Regular Expressions
JavaScript - Chapter 9 - TypeConversion and Regular Expressions
WebStackAcademy
 
Regular Expressions 2007
Regular Expressions 2007
Geoffrey Dunn
 
JavaScript Regular Expression Match
JavaScript Regular Expression Match
raj upadhyay
 
Web Forms People Don't Hate
Web Forms People Don't Hate
cliener
 
How to check valid email? Find using regex(p?)
How to check valid email? Find using regex(p?)
Visuality
 
JSregularExpressions.pptx
JSregularExpressions.pptx
MattMarino13
 
Javascript regular expression
Javascript regular expression
Dhairya Joshi
 
3.2 javascript regex
3.2 javascript regex
Jalpesh Vasa
 
02. input validation module v5
02. input validation module v5
Eoin Keary
 
And Now You Have Two Problems
And Now You Have Two Problems
Luca Mearelli
 

More from cliener (7)

Designing for Learning Difficulties @ Web Directions Design 2019
Designing for Learning Difficulties @ Web Directions Design 2019
cliener
 
Skeleton screens early draft for JSFoo 2017
Skeleton screens early draft for JSFoo 2017
cliener
 
Bad Form @ Form, Function & Class 2016
Bad Form @ Form, Function & Class 2016
cliener
 
No Fear
No Fear
cliener
 
Blurred lines
Blurred lines
cliener
 
Bad Form @ JSConf Asia 2014
Bad Form @ JSConf Asia 2014
cliener
 
Building & Breaking Web Forms with Quaid-JS
Building & Breaking Web Forms with Quaid-JS
cliener
 
Designing for Learning Difficulties @ Web Directions Design 2019
Designing for Learning Difficulties @ Web Directions Design 2019
cliener
 
Skeleton screens early draft for JSFoo 2017
Skeleton screens early draft for JSFoo 2017
cliener
 
Bad Form @ Form, Function & Class 2016
Bad Form @ Form, Function & Class 2016
cliener
 
Blurred lines
Blurred lines
cliener
 
Bad Form @ JSConf Asia 2014
Bad Form @ JSConf Asia 2014
cliener
 
Building & Breaking Web Forms with Quaid-JS
Building & Breaking Web Forms with Quaid-JS
cliener
 
Ad

Recently uploaded (20)

Securing AI - There Is No Try, Only Do!.pdf
Securing AI - There Is No Try, Only Do!.pdf
Priyanka Aash
 
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Safe Software
 
You are not excused! How to avoid security blind spots on the way to production
You are not excused! How to avoid security blind spots on the way to production
Michele Leroux Bustamante
 
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC
 
AI VIDEO MAGAZINE - June 2025 - r/aivideo
AI VIDEO MAGAZINE - June 2025 - r/aivideo
1pcity Studios, Inc
 
cnc-processing-centers-centateq-p-110-en.pdf
cnc-processing-centers-centateq-p-110-en.pdf
AmirStern2
 
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
revolcs10
 
Cracking the Code - Unveiling Synergies Between Open Source Security and AI.pdf
Cracking the Code - Unveiling Synergies Between Open Source Security and AI.pdf
Priyanka Aash
 
Cyber Defense Matrix Workshop - RSA Conference
Cyber Defense Matrix Workshop - RSA Conference
Priyanka Aash
 
Oh, the Possibilities - Balancing Innovation and Risk with Generative AI.pdf
Oh, the Possibilities - Balancing Innovation and Risk with Generative AI.pdf
Priyanka Aash
 
Quantum AI Discoveries: Fractal Patterns Consciousness and Cyclical Universes
Quantum AI Discoveries: Fractal Patterns Consciousness and Cyclical Universes
Saikat Basu
 
Tech-ASan: Two-stage check for Address Sanitizer - Yixuan Cao.pdf
Tech-ASan: Two-stage check for Address Sanitizer - Yixuan Cao.pdf
caoyixuan2019
 
"Scaling in space and time with Temporal", Andriy Lupa.pdf
"Scaling in space and time with Temporal", Andriy Lupa.pdf
Fwdays
 
Security Tips for Enterprise Azure Solutions
Security Tips for Enterprise Azure Solutions
Michele Leroux Bustamante
 
A Constitutional Quagmire - Ethical Minefields of AI, Cyber, and Privacy.pdf
A Constitutional Quagmire - Ethical Minefields of AI, Cyber, and Privacy.pdf
Priyanka Aash
 
WebdriverIO & JavaScript: The Perfect Duo for Web Automation
WebdriverIO & JavaScript: The Perfect Duo for Web Automation
digitaljignect
 
AI vs Human Writing: Can You Tell the Difference?
AI vs Human Writing: Can You Tell the Difference?
Shashi Sathyanarayana, Ph.D
 
10 Key Challenges for AI within the EU Data Protection Framework.pdf
10 Key Challenges for AI within the EU Data Protection Framework.pdf
Priyanka Aash
 
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik
 
Python Conference Singapore - 19 Jun 2025
Python Conference Singapore - 19 Jun 2025
ninefyi
 
Securing AI - There Is No Try, Only Do!.pdf
Securing AI - There Is No Try, Only Do!.pdf
Priyanka Aash
 
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Safe Software
 
You are not excused! How to avoid security blind spots on the way to production
You are not excused! How to avoid security blind spots on the way to production
Michele Leroux Bustamante
 
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC
 
AI VIDEO MAGAZINE - June 2025 - r/aivideo
AI VIDEO MAGAZINE - June 2025 - r/aivideo
1pcity Studios, Inc
 
cnc-processing-centers-centateq-p-110-en.pdf
cnc-processing-centers-centateq-p-110-en.pdf
AmirStern2
 
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
revolcs10
 
Cracking the Code - Unveiling Synergies Between Open Source Security and AI.pdf
Cracking the Code - Unveiling Synergies Between Open Source Security and AI.pdf
Priyanka Aash
 
Cyber Defense Matrix Workshop - RSA Conference
Cyber Defense Matrix Workshop - RSA Conference
Priyanka Aash
 
Oh, the Possibilities - Balancing Innovation and Risk with Generative AI.pdf
Oh, the Possibilities - Balancing Innovation and Risk with Generative AI.pdf
Priyanka Aash
 
Quantum AI Discoveries: Fractal Patterns Consciousness and Cyclical Universes
Quantum AI Discoveries: Fractal Patterns Consciousness and Cyclical Universes
Saikat Basu
 
Tech-ASan: Two-stage check for Address Sanitizer - Yixuan Cao.pdf
Tech-ASan: Two-stage check for Address Sanitizer - Yixuan Cao.pdf
caoyixuan2019
 
"Scaling in space and time with Temporal", Andriy Lupa.pdf
"Scaling in space and time with Temporal", Andriy Lupa.pdf
Fwdays
 
Security Tips for Enterprise Azure Solutions
Security Tips for Enterprise Azure Solutions
Michele Leroux Bustamante
 
A Constitutional Quagmire - Ethical Minefields of AI, Cyber, and Privacy.pdf
A Constitutional Quagmire - Ethical Minefields of AI, Cyber, and Privacy.pdf
Priyanka Aash
 
WebdriverIO & JavaScript: The Perfect Duo for Web Automation
WebdriverIO & JavaScript: The Perfect Duo for Web Automation
digitaljignect
 
AI vs Human Writing: Can You Tell the Difference?
AI vs Human Writing: Can You Tell the Difference?
Shashi Sathyanarayana, Ph.D
 
10 Key Challenges for AI within the EU Data Protection Framework.pdf
10 Key Challenges for AI within the EU Data Protection Framework.pdf
Priyanka Aash
 
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik
 
Python Conference Singapore - 19 Jun 2025
Python Conference Singapore - 19 Jun 2025
ninefyi
 
Ad

Validating forms (and more) with the HTML5 pattern attribute

  • 1. Validating Forms (AND MORE) WITH THE HTML5 Pattern Attribute @cliener
  • 2. HTML5 RECAP http://wufoo.com/html5/ Before I get stuck into patterns, I’ll quickly go through some of the important parts of HTML5 forms. If you want to play along at home, have a look at Wufoo’s HTML Forms guide.
  • 3. HTML5 RECAP <input  type="email"> Most of the new input types come with awesome custom keyboards for iOS and more recent Android (amongst others). Some browser versions offer basic validation in but inconsistent implementations mean they can’t be relied upon. The key new inputs types are “email”,
  • 7. HTML5 RECAP <input  type="datetime"> Unfortunately “datetime”, “time” and “year” input types have been marked as “in danger” by the W3C due to poor and inconsistent browser support. There’s something of a chicken and egg situation when it comes to standards and browser support. Unfortunately for the HTML5 date and time inputs,
  • 8. the chicken looks something like this.
  • 9. HTML5 RECAP <input  required> Important attributes to note are “required”,
  • 10. HTML5 RECAP <input  placeholder=              "dd/mm/yyyy"> “placeholder”
  • 11. PATTERNS <input  pattern="/d*"> and, of course, “pattern”. Patterns allow you to provide a regular expression string primarily for input validation. A numeric regulation expression like the this one can trigger a numeric keyboard. You’ll often see the above pattern as “[0-9]*” because most people don’t know how to write regular expressions to save themselves.
  • 12. NOW YOU HAVE TWO PROBLEMS http://evolt.org/node/36435 I can’t remember the origin so I’ll call it an old saying: “You have a problem which can be solved with a regular expression. Now you have two problems.” I won’t pretend regular expressions are the easiest to write however a good guide the one on Evolt will certainly make life easier for you.
  • 13. PATTERNS /d*/ .test("12345"); >>>  true I find the JS console (in a browser near you) are a handy way to test out regular expressions. This one matches any numeric value
  • 14. PATTERNS /d*/ .test("Once  I  caught  a              fish  alive"); >>>  false And correctly returns false to a string.
  • 15. POSTCODE /d{4}/ .test("605"); >>>  false Australian postcodes are easily matched with this pattern - exactly four digits - returning false here for “605”
  • 17. YEAR /d{4}|d{2}/ .test("13"); >>>  true Getting slightly more complex with a pipe which acts as an “or” switch, we can match either two or four digit years.
  • 18. TIME /(([0-­‐1]d)|(2[0-­‐3])) :[0-­‐5]d/ .test("08:37"); >>>  true Square brackets specify a range of values, round brackets group sub-expressions together: here matching a twenty hour time value.
  • 19. TIME /(([0-­‐1]?d)|(2[0-­‐3])) (:|.)[0-­‐5]d/ .test("8.37"); >>>  true With a slight modification, we’re now matching a wider range of natural inputs.
  • 23. At this point I can understand if you’re a little shocked, so I’ll pull it back a little.
  • 24. EMAIL /w+@w+.w+/ .test("[email protected]") >>>  true Email addresses are often something of a mine field but, on the surface, the pattern is fairly simple: “[email protected]
  • 25. EMAIL /w+@w+.w+/ .test("cli+ner@                  server.com.au"); >>>  true Already we’re matching better than most email validation rules out there.
  • 26. EMAIL /w+@w+.w+/ .test("[email protected]"); >>>  true Except the simplicity soon gets us unstuck when we get false positives. Given how scary date validation was, it’s tempting to see what Google has to offer
  • 27. EMAIL /(?:(?:rn)?[  t])*(?:(?:(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[  t]))*"(?:(?:rn)?[  t])*) (?:.(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[  t]))*"(?:(?:rn)? [  t])*))*@(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[  t])*)(?:.(?:(?:r n)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[  t])*))*|(?:[^()<>@,;:".[]  000-­‐ 031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[  t]))*"(?:(?:rn)?[  t])*)*<(?:(?:rn)?[  t])*(?:@(?:[^()<>@,;:".[]  000-­‐ 031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[  t])*)(?:.(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:r n)?[  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[  t])*))*(?:,@(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(? =[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[  t])*)(?:.(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:". []]))|[([^[]r]|.)*](?:(?:rn)?[  t])*))*)*:(?:(?:rn)?[  t])*)?(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r ]|.|(?:(?:rn)?[  t]))*"(?:(?:rn)?[  t])*)(?:.(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r ]|.|(?:(?:rn)?[  t]))*"(?:(?:rn)?[  t])*))*@(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]| .)*](?:(?:rn)?[  t])*)(?:.(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)? [  t])*))*>(?:(?:rn)?[  t])*)|(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[  t]))*"(?:(?:rn)? [  t])*)*:(?:(?:rn)?[  t])*(?:(?:(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[  t]))*"(?:(?:r n)?[  t])*)(?:.(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[  t]))*"(?:(?:r n)?[  t])*))*@(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[  t])*)(?:.(?: (?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[  t])*))*|(?:[^()<>@,;:".[]   000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[  t]))*"(?:(?:rn)?[  t])*)*<(?:(?:rn)?[  t])*(?:@(?:[^()<>@,;:".[]   000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[  t])*)(?:.(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?: (?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[  t])*))*(?:,@(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+| Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[  t])*)(?:.(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;: ".[]]))|[([^[]r]|.)*](?:(?:rn)?[  t])*))*)*:(?:(?:rn)?[  t])*)?(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^ "r]|.|(?:(?:rn)?[  t]))*"(?:(?:rn)?[  t])*)(?:.(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^ "r]|.|(?:(?:rn)?[  t]))*"(?:(?:rn)?[  t])*))*@(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[] r]|.)*](?:(?:rn)?[  t])*)(?:.(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?: rn)?[  t])*))*>(?:(?:rn)?[  t])*)(?:,s*(?:(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)? [  t]))*"(?:(?:rn)?[  t])*)(?:.(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)? [  t]))*"(?:(?:rn)?[  t])*))*@(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)? [  t])*)(?:.(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[  t])*))*|(?: [^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[  t]))*"(?:(?:rn)?[  t])*)*<(?:(?:rn)?[  t])*(?:@(?: [^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[  t])*)(?:.(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]   000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[  t])*))*(?:,@(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?: (?:rn)?[  t])+|Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[  t])*)(?:.(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+| Z|(?=[["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[  t])*))*)*:(?:(?:rn)?[  t])*)?(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[ ["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[  t]))*"(?:(?:rn)?[  t])*)(?:.(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[ ["()<>@,;:".[]]))|"(?:[^"r]|.|(?:(?:rn)?[  t]))*"(?:(?:rn)?[  t])*))*@(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[ ["()<>@,;:".[]]))|[([^[]r]|.)*](?:(?:rn)?[  t])*)(?:.(?:(?:rn)?[  t])*(?:[^()<>@,;:".[]  000-­‐031]+(?:(?:(?:rn)?[  t])+|Z|(?=[["()<>@,;:". []]))|[([^[]r]|.)*](?:(?:rn)?[  t])*))*>(?:(?:rn)?[  t])*))*)?;s*)/ .test("[email protected]"); >>>  true http://www.codinghorror.com/blog/2005/02/regex-use-vs-regex-abuse.html And here is 6.2KB of RFC standard-compliant email regular expression.
  • 28. Which brings me to a major problem when regular expressions.
  • 29. Unfortunately, a fair number of programmers out in the wild haven’t quite worked out regular expressions yet so you need to be really careful about what you’re write.
  • 31. SECURITY As a whole, password validation is awful.
  • 32. SECURITY Over-validation is a great way to make people hate you
  • 33. SECURITY because, as much as you might think otherwise, you don’t know as much about them as you think you do.
  • 34. SECURITY But then there are people like, presumably, Bob.
  • 35. And here be dragyns. In the last couple of years, millions of passwords - hashed and otherwise - have been grabbed from various online services which means that everything we though we knew about password validation is, in essence, wrong. This also means that enforced password validation is probably wrong too. So, please don’t. Invest your energy into two factor authentication or something else that’s actually secure rather than incurring the wrath of the users who do know what they’re doing.
  • 36. CREDIT CARDS "4123  5678  9012  3456" .replace(/(s)/g,  ""); >>>  "4123567890123456" While I’ve shown how awesome regular expressions are for pattern validation, they can also manipulate data. Right here is everything you need to strip spaces from a credit card number so I can enter it with spaces as it is on my card. You no longer have any excuses.
  • 37. ERROR MESSAGES <input  pattern="d{4}"   title="Please  enter  a   valid  postcode  e.g.   3000"> Rather crucial when doing pattern validation is presenting a meaningful error message to users. In HTML5, browsers are abusing the title attribute to this end. You can also set the .setCustomValidity() DOM property but title will work for most instances.
  • 38. ERROR MESSAGES The results aren’t perfect, but they’re a whole lot better than server validation.
  • 39. In summary, are regular expressions better than kittens? I think the answer is definitively yes.
  • 41. FURTHER READING HTML5 Rocks: Constraint Validation: Native Client Side Validation for Web Forms http://www.html5rocks.com/en/tutorials/ forms/constraintvalidation/