HTML5 Form Pattern for word count vs character count - regex

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>

Related

HTML validation rules with 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

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 pattern for cc expiry mm/yy

I'm trying to figure out a pattern regex for credit card expiry date input that would return mm/yy
currently I came across yyyy-mm-dd pattern represented like this:
<input type="text" pattern="(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))" />
That I tried to edit, but I can't seem to get it right for mm/yy
If you use this pattern, user couldn't enter invalid months number like "34" - first number has to be "0" or "1". "/" is not optional here.
Also "title" can help user to enter valid code sending additional message in tooltip.
<form>
<input
type="text"
pattern="(?:0[1-9]|1[0-2])/[0-9]{2}"
title="Enter a date in this format MM/YY"
/>
<input type="submit">
</form>
Try with this regex, it should work:
<form>
<input type="text" pattern="([0-9]{2}[/]?){2}" />
<input type="submit">
</form>
It matches two({2}) digits([0-9]) plus an hypothetical "/"([/]?), all this two times.
The first one it will match "mm/", then just the "yy" part.
Hope it helps!

Angular2 pattern validator on Input

I'm trying to setup a pattern validator with the following regex :
^(((0|[1-9]\d{0,2})(\.\d{2})?)|())$
Try Regex here
That should allow me to get 1 to 3 digits, and then a decimal part of maximum 2 digits, and that should allow empty values as well.
The problem is that either my input is of type text and the validator is rejecting my input (any input since it's not considered as a digit I believe); or the input is of type number and without step="any" my input value is rejected if I have a decimal input (while the regex seems to be working on simpler values), and with step="any" it seems my regex is not working at all, allowing whatever value because of the step.
<form (ngSubmit)="onSubmit()" #bottleUpdatePriceForm="ngForm" >
<div class="form-group" *ngFor="let bottle of bottleArrayToUpdate; let i = index">
<label for="bottlePrice">{{bottle.name}} : </label>
<input type="number" class="form-control" name="bottlePrice" autocomplete="off" step="any"
[pattern]="pricePattern"
[(ngModel)]="bottleArrayToUpdate[i].price">
</div>
<button type="submit" class="btn btn-default">Submit</button>
<!--(click)="bottleUpdatePriceForm.reset();"-->
</form>
EDIT : adding my component code for regex binding
private pricePattern = /^(((0|[1-9]\d{0,2})(\.\d{2})?)|())$/;
Be it text or number I don't really care, I just need the pattern to work on my input... Any insight or something I am missing ?
Here is a working example in a plunkr : https://plnkr.co/edit/znVaS7?p=info
You can switch the input line in the plunkr to see the different cases :
<input type="text" class="form-control" name="bottlePrice" autocomplete="off"
<input type="number" class="form-control" name="bottlePrice" autocomplete="off" step="any"
Unrelated to the main issue : Is there any way to call the form reset from the component rather than directly in the template ?
==> bottleUpdatePriceForm.reset();
I was wondering, this is just for bonus.
Thanks a lot
This is not a direct solution for the not working regex, but this works with the same purpose. So remove the pattern and just change your input with max and min instead:
<input type="number" class="form-control" name="bottlePrice"
autocomplete="off" step="any" max="999" min="0"
[(ngModel)]="bottleArrayToUpdate[i].price">

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).