HTML validation rules with regex - regex

I need to validate a code format:
Need to be 10 characters
A mix of letters and numbers
At least 1 letter from a-f
and I write:
<input maxlength="200" type="text" name="code" id="code" required="required" class="form-control input-lg" pattern="[a-fA-F0-9]{10}" title="Wrong Code" placeholder="Security Code" />
so my pattern is pattern="[a-fA-F0-9]{10}" but HOW I can add rules that at least 1 letter from a-f is required?

You could use a positive lookahead (?= to assert that what follows contains at least 1 occurance of [a-fA-F]
Updated version suggested by Wiktor Stribiżew
(?=[0-9]*[a-fA-F])[a-fA-F0-9]{10}
Explanation about the positive lookahead (?=[0-9]*[a-fA-F])
(?: Non capturing group
[0-9]* Match zero or more times a digit
[a-fA-F] Match a-f in lower or uppercase
) Close non capturing group
<form>
<input maxlength="200" type="text" name="code" id="code" required="required" class="form-control input-lg" pattern="(?=[0-9]*[a-fA-F])[a-fA-F0-9]{10}" title="Wrong Code" placeholder="Security Code" />
<input type="submit" name="submit">
</form>

Regex pattern to match at least 1 number and 1 character in a string
/^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$/
Look at the regex in this thread, it should fit your needs. You need to replace your pattern with it.

try this one
<form action="/action_page.php">
<input type="text" name="code" id="code" required="required" class="form-control input-lg" pattern="(?=[a-fA-F0-9]*[a-fA-F])[a-fA-F0-9]{10}" title="Wrong Code" placeholder="Security Code" />
<input type="submit">
</form>
<b>
<pre>
1)Need to be 10 characters
2)A mix of letters and numbers
3)At least 1 letter from a-f
</pre></b>

There is already an accepted answer, but that one is not complete.
The requirements state that there needs to be "A mix of letters and numbers" and "At least 1 letter from a-f". That would mean that these entries below would match as well:
8adfl9542a
m0ammmmmmm
11111a1111
They do not match in the accepted answer. I created my own regex which shows that the above entries match as well:
(?=.*[a-fA-F]+)(?=.*[0-9]+)[a-zA-Z0-9]{10}
Explanation:
(?=.*[a-fA-F]+) Match at least one character from a-f (upper- or lowercase)
(?=.*[0-9]+) Match at least one number
[a-zA-Z0-9]{10} Total string must be 10 characters long and must consist of characters from a-z (upper- or lowercase) or numbers

Related

html pattern attribute

I'm trying to limit my text input to only allow letters, not numbers. With a maximum of 100 characters. I'm having trouble finding out how to use the pattern attribute to only allow letters. Here is a portion of my code attempting this.
<form action="http://www.severien.com/grit/formecho.php" method="post" target="_blank">
<label for="videorequests"> Video Requests:</label>
<input type="text" id="videorequests" name="videorequests" maxlength="100" pattern="[a-z]{1,100}" />
<input type="submit" value="Submit" class="submitbutton" />
</form>
Using the attribute maxlength I'm limiting the character input to 100. How do I use pattern to limit the character use to only letters, excluding numerical characters?
use this
pattern="[A-Z a-z]{1,100}"

HTML5 input pattern (prevent first to 0)

I try to let the user input a version number.
With a minimum of 3 numbers in pairs of 2 like:
1.1.1
or
11.11.11
or
11.10.11.1
I only NOT want that the first number starts with a 0 like:
01.1.1
or
0.11.11.11
I not want the 0 (i am very happy i came this far)
<form onsubmit="alert('Submitted.');return false;">
<input type="text" required="" pattern="((^|\.)(([1-9]?\d))){2,4}$" value="" placeholder="Try it out.">
<input type="submit" value="»">
</form>
Use
input:valid {
color: black;
}
input:invalid {
color: red;
}
<form onsubmit="alert('Submitted.');return false;">
<input type="text" required pattern="[1-9]\d?(?:\.\d{1,2}){1,3}" value="" placeholder="Try it out.">
<input type="submit" value="»">
</form>
The pattern will be translated to /^(?:[1-9]\d?(?:\.\d{1,2}){1,3})$/ and will match
^(?: - start of the string with a non-capturing group start
[1-9]\d? - a digit from 1 to 9 and then any optional digit
(?:\.\d{1,2}){1,3} - 1 to 3 occurrences of:
\. - a dot
\d{1,2} - any 1 or 2 digits
)$ - end of the automatically generated group and end of the string.
See the regex demo online.

HTML pattern does't work even with correct regular expression

Regular expression: ((?=.*\d)(?=.*[A-Z]))
Input string: qwer1Q
The input string above pass the validation if you check it in regex101
However, if you include the regex in a html pattern attribute and try to validate the same string again, it shall not pass:
<form>
<div>
<input type="text" placeholder="Password"
pattern="((?=.*\d)(?=.*[A-Z]))">
</div>
<div>
<button>Submit</button>
</div>
</form>
You need to make sure the pattern matches (and consumes) the entire string because the HTML5 pattern regex is anchored by default.
<form>
<div>
<input type="text" placeholder="Password"
pattern="(?=.*\d)(?=.*[A-Z]).*">
</div>
<div>
<button>Submit</button>
</div>
</form>
The (?=.*\d)(?=.*[A-Z]).* pattern will be turned into ^(?:(?=.*\d)(?=.*[A-Z]).*)$ and it will match:
^ - start of string
(?: - start of a non-capturing group:
(?=.*\d) - a positive lookahead check to make sure there is at least 1 digit
(?=.*[A-Z]) - a positive lookahead check to make sure there is at least 1 uppercase letter
.* - any 0+ chars, greedily, up to the end of string
) - end of the non-capturing group
$ - end of string.

HTML5 Form Pattern for word count vs character count

I'm using HTML5 form validation on the frontend to provide users with some feedback when they exceed a character limit in an input.
<input id="description" placeholder="description" required="required" type="text" pattern=".{3,500}">
This, with some CSS, will let me tell the user if they have not entered between 3 and 500 characters.
How could I actually set the pattern to match the number of "words" instead of characters .e.g. minimum of one word and max of 50 words.
This regex should work, the first clause (\w+\W+){0,49} will match between 0-49 words (of one or more characters) followed by one or more whitespaces. The second part \w+\W* will match one more word with optional whitespace following.
<form>
<input id="description" placeholder="description" required="required" type="text" pattern="(\w+\W+){0,49}\w+\W*">
<input type="submit" />
</form>

regex pattern matching in HTML5 is not working properly

I have an input text box in my HTML form which looks for a regex pattern as shown below.
I am looking for anything to be entered other than white spaces or blank. I tried all the following below and none of them is allowing me to enter any normal text such as "hello world" and "helloworld" in it.Any suggestions are most welcome. Thanks
<input name="item" type="text" size="25" autofocus="autofocus" pattern="^\S$" title="Enter something valid"/>
<input name="item" type="text" size="25" autofocus="autofocus" pattern="^[^\s]*$" title="Enter something valid"/>
<input name="item" type="text" size="25" autofocus="autofocus" pattern="^[\S]*$" title="Enter something valid"/>
EDIT:
after removing the anchor, this works for "helloworld" but not for "hello world". So I think it has to do with regex pattern.
<input name="item" type="text" size="25" autofocus="autofocus" pattern="[^\s]*" title="Enter something valid"/>
[^\s]* will match against anything that contains no spaces, so a space in the words will not match.
You probably want something like .*[^\s].* to match a string with at least one non-space character.
The required attribute is probably the best way to guard against blanks (or ^$ should work).