HTML attribute: pattern #
::: section-content
The pattern
attribute specifies a
regular
expression
the form control's value should match. If a non-null
value doesn't
conform to the constraints set by the pattern
value, the
ValidityState
object's read-only
patternMismatch
property will be true.
:::
Try it #
::: section-content ::: iframe ::: {.output-header .border-rounded-top}
HTML Demo: pattern #
Reset :::
::: {#warning-no-script .warning-container} ::: warning The interactive example cannot be shown because JavaScript is disabled. ::: :::
::: {#warning-mathml-not-supported .warning-container .hidden} ::: warning The interactive example cannot be shown because MathML is not supported by your browser. ::: :::
::: {#editor-container .editor-container .tabbed-shorter .hidden .border-rounded-bottom editor-type=“tabbed”} ::: {#tab-container .section .tabs} ::: {#tablist .tab-list role=“tablist”} HTML
CSS
JavaScript :::
::: {#html-panel .section .hidden tabindex=“0” role=“tabpanel” aria-labelledby=“html” aria-hidden=“true”} ::: {#html-editor}
<label for="pin">PIN: (4 digits)</label>
<input name="pin" type="password" pattern="\d{4,4}" required />
::: :::
::: {#css-panel .section .hidden tabindex=“0” role=“tabpanel” aria-labelledby=“css” aria-hidden=“true”} ::: {#css-editor} label { display: block; margin-top: 1em; }
input:valid {
background-color: palegreen;
}
input:invalid {
background-color: lightpink;
}
::: :::
::: {#js-panel .section .hidden tabindex=“0” role=“tabpanel” aria-labelledby=“js” aria-hidden=“true”} ::: {#js-editor} ::: ::: :::
::: {#output .output-container}
Output #
::: :::
::: {.section .console-container .hidden aria-hidden=“true”}
Console Output #
![] clear console
::: {#console .console} ::: :::
::: {#html-output .output .editor-tabbed} %html-content% ::: ::: :::
Overview #
::: section-content
The pattern
attribute is an attribute of the
text,
tel,
email,
url,
password, and
search input types.
The pattern
attribute, when specified, is a regular expression which
the input's
value
must match for the value
to pass
constraint validation. It must be a
valid JavaScript regular expression, as used by the
RegExp
type, and as documented in our
guide on regular
expressions;
the 'u'
flag is specified when compiling the regular expression so
that the pattern is treated as a sequence of Unicode code points,
instead of as ASCII. No forward slashes should be specified around the
pattern text.
If the specified pattern is not specified or is invalid, no regular expression is applied and this attribute is ignored.
::: {#sect1 .notecard .note}
Note: Use the
title
attribute to specify
text that most browsers will display as a tooltip to explain what the
requirements are to match the pattern. You must not rely on the
tooltip alone for an explanation. See below for more information on
usability.
:::
Some of the input types supporting the pattern attribute, notably the
email and
url input
types, have expected value syntaxes that must be matched. If the pattern
attribute isn't present, and the value doesn't match the expected
syntax for that value type, the
ValidityState
object's read-only
typeMismatch
property will be true.
:::
Usability #
::: section-content
When including a pattern
, provide a description of the pattern in
visible text near the control. Additionally, include a
title
attribute which gives a
description of the pattern. User agents may use the title contents
during constraint validation to tell the user that the pattern is not
matched. Some browsers show a tooltip with title contents, improving
usability for sighted users. Additionally, assistive technology may read
the title aloud when the control gains focus, but this should not be
relied upon for accessibility.
:::
Constraint validation #
::: section-content
If the input's value is not the empty string and the value does not
match the entire regular expression, there is a constraint violation
reported by the
ValidityState
object's
patternMismatch
property being true
. The pattern's regular expression, when matched
against the value, must have its start anchored to the start of the
string and its end anchored to the end of the string, which is slightly
different from JavaScript regular expressions: in the case of pattern
attribute, we are matching against the entire value, not just any
subset, as if a ^(?:
were implied at the start of the pattern and )$
at the end.
::: {#sect2 .notecard .note}
Note: If the pattern
attribute is specified with no value, its
value is implicitly the empty string. Thus, any non-empty input
value
will result in constraint violation.
:::
:::
Examples #
Matching a phone number #
::: section-content Given the following:
::: code-example [html]{.language-name}
<p>
<label>
Enter your phone number in the format (123) - 456 - 7890 (<input
name="tel1"
type="tel"
pattern="[0-9]{3}"
placeholder="###"
aria-label="3-digit area code"
size="2" />) -
<input
name="tel2"
type="tel"
pattern="[0-9]{3}"
placeholder="###"
aria-label="3-digit prefix"
size="2" />
-
<input
name="tel3"
type="tel"
pattern="[0-9]{4}"
placeholder="####"
aria-label="4-digit number"
size="3" />
</label>
</p>
:::
Here we have 3 sections for a north American phone number with an
implicit label encompassing all three components of the phone number,
expecting 3-digits, 3-digits and 4-digits respectively, as defined by
the pattern
attribute set on each.
If the values are too long or too short, or contain characters that
aren't digits, the patternMismatch
will be true. When true
, the
element matches the
:invalid
CSS pseudo-classes.
::: code-example [css]{.language-name}
input:invalid {
border: red solid 3px;
}
:::
::: {#sect3 .code-example} ::: iframe ::: :::
If we had used
minlength
and
maxlength
attributes instead, we may have seen
validityState.tooLong
or
validityState.tooShort
being true.
:::
Specifying a pattern #
::: section-content
You can use the
pattern
attribute to
specify a regular expression that the inputted value must match in order
to be considered valid (see
Validating against a regular
expression
for a simple crash course on using regular expressions to validate
inputs).
The example below restricts the value to 4-8 characters and requires that it contain only lower-case letters.
::: code-example [html]{.language-name}
<form>
<label for="uname">Choose a username: </label>
<input
type="text"
id="uname"
name="name"
required
size="45"
pattern="[a-z]{4,8}"
title="4 to 8 lowercase letters" />
<span class="validity"></span>
<p>Usernames must be lowercase and 4-8 characters in length.</p>
<button>Submit</button>
</form>
:::
This renders like so:
::: {#sect4 .code-example} ::: iframe ::: ::: :::
Accessibility Concerns #
::: section-content
When a control has a pattern
attribute, the title
attribute, if
used, must describe the pattern. Relying on the title
attribute for
the visual display of text content is generally discouraged as many user
agents do not expose the attribute in an accessible manner. Some
browsers show a tooltip when an element with a title is hovered, but
that leaves out keyboard-only and touch-only users. This is one of the
several reasons you must include information informing users how to fill
out the control to match the requirements.
While title
s are used by some browsers to populate error messaging,
because browsers sometimes also show the title as text on hover, it
therefore shows in non-error situations, so be careful not to word
titles as if an error has occurred.
:::
Specifications #
::: _table #
Specification #
HTML Standard
[#
attr-input-pattern]{.small}
:::
Browser compatibility #
::: _table Desktop Mobile
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari on IOS Samsung Internet
pattern
4 12 4 10 ≤12.1 5 ≤37 18 4 ≤12.1 4 1.0
:::
See also #
::: section-content
::: _attribution
© 2005–2023 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5
or later.
https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern{._attribution-link}
:::