如何修复HTML输入元素模式属性不适用于名称验证正则表达式?

How to fix a HTML input element pattern attribute not working with name validation regex?

提问人:Brendan 提问时间:8/18/2023 最后编辑:Patrick JanserBrendan 更新时间:9/1/2023 访问量:102

问:

我正在尝试使用特定的正则表达式来验证用户的名字 在 HTML 表单上。

我使用正则表达式测试器测试了正则表达式,但正则表达式在这里不能作为模式属性中的字符串工作。

问题是什么?有没有可能的解决方案?

<input
  name="firstName"
  pattern="^[\w'\-,.][^0-9_!¡?÷?¿\/\\+=@#$%ˆ&*(){}|~<>;:[\]]{2,}$"
  title="Your first name must be valid"
  type="text"
  placeholder="First Name"
  required
/>

关于规则,基本上是只允许名字。 我不确定所有的规则,但这只是文字,空格是 允许,不允许使用数字,并且只允许使用某些字符 允许,例如撇号()、连字符()等。'-

HTML 正则表达式 表单 验证

评论

1赞 Kosh 8/18/2023
验证规则是什么?我不清楚预期的行为是什么。
0赞 Brendan 8/19/2023
@Kosh 基本上只允许使用名称。我不确定所有的规则,但它只是单词,允许空格,不允许使用数字,只允许使用某些字符,例如撇号('),破折号(-)等。
0赞 Barmar 8/19/2023
仅供参考,您不需要,并且在使用时.模式会自动定位。^$pattern
1赞 Kosh 8/19/2023
@Brendan,看起来你的问题是你不知道你到底想要什么。请先弄清楚。
0赞 user3783243 8/19/2023
阅读有关字符类的信息,regular-expressions.info/charclass.html。这应该是你需要的。

答:

0赞 Patrick Janser 8/21/2023 #1

我认为问题可能是由于您在 字符类。根据正则表达式风格的一些变化 在 JavaScript 中,可以启用 uv 标志(似乎 硬编码或自动触发,无法设置 手动),这可能会导致字符类出现问题。为 例如,现在应该用 also 进行转义 在字符类中。你在模式中使用了一些。[a-z|]|\|

我不会使用而是替换它,用于匹配 任何语言的任何信件。这将匹配“é”或“ÿ”,而不仅仅是 没有重音的英文字母。\w\p{L}

匹配所有正确的情况相当复杂,但这是 我能建议什么:

^(?:\p{L}['´ \-]?)+(?<=[^\s\-'´])$

这个想法是接受以字母开头的输入,然后 后跟可选的空格、连字符或或、一个或多个 次。为了避免以空格或其中一个字符结束,你 可以在模式结束之前添加积极的后视。'´

这将避免接受类似 或 .Jack-Ooooh'

另一个优点是你不能接受或.Jean--JaquesO''Neil

form {
  margin: 1em;
  padding: 0;
  display: flex;
  column-gap: 1em;
}

input {
  padding: 0.25em .5em;
  border: 1px solid gray;
}

input[type="text"] {
  box-shadow: 1px 1px 4px inset rgba(0, 0, 0, 0.1);
}
input[type="text"]:focus {
  outline: 1px solid gray;
}

input[pattern]:focus:valid {
  border-color: green;
}

input[pattern]:focus:invalid {
  border-color: red;
}

input[type="submit"] {
  background-color: silver;
}

:focus-visible {
  outline: none;
}
<form action="#">
  <div class="form-element">
    <input
      name="firstName"
      pattern="^(?:\p{L}['´ \-]?)+(?<=[^\s\-'´])$"
      title="Your first name must be valid"
      type="text"
      placeholder="First Name"
      required
    />
  </div>
  <div class="form-element form-submit">
    <input type="submit" value="Submit" />
  </div>
</form>

您还可以使用示例和解释来测试正则表达式 这里: https://regex101.com/r/tmEsgX/2