代码之家  ›  专栏  ›  技术社区  ›  Jeromy French

模式属性值不是有效的正则表达式

  •  2
  • Jeromy French  · 技术社区  · 7 年前

    我的HTML有以下输入元素(打算接受以“.com”结尾的电子邮件地址):

    <input type="email" name="p_email_ad" id="p_email_ad" value="" required="required" pattern="[\-a-zA-Z0-9~!$%\^&amp;*_=+}{\'?]+(\.[\-a-zA-Z0-9~!$%\^&amp;*_=+}{\'?]+)*@([a-zA-Z0-9_][\-a-zA-Z0-9_]*(\.[\-a-zA-Z0-9_]+)*\.([cC][oO][mM]))(:[0-9]{1,5})?$" maxlength="64">
    

    在过去两个月的某个时候,Chrome已经开始在验证输入时返回以下JavaScript错误(并阻止提交父表单):

    [\-a-zA-Z0-9~!$%\^&*_=+}{\'?]+(\.[\-a-zA-Z0-9~!$%\^&*_=+}{\'?]+)*@([a-zA-Z0-9_][\-a-zA-Z0-9_]*(\.[\-a-zA-Z0-9_]+)*\.([cC][oO][mM]))(:[0-9]{1,5})?$ 不是有效的正则表达式:Uncaught SyntaxError:无效 正则表达式: /[\-a-zA-Z0-9~!$%\^&*_=+}{\'?]+(\.[\-a-zA-Z0-9~!$%\^&*_=+}{\'?]+)*@([a-zA-Z0-9_][\-a-zA-Z0-9_]*(\.[\-a-zA-Z0-9_]+)*\.([cC][oO][mM]))(:[0-9]{1,5})?$/

    Regex101.com 喜欢regex模式,但Chrome不喜欢。我有什么语法错误?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Wiktor Stribiżew    7 年前

    使用

    pattern="[-a-zA-Z0-9~!$%^&amp;*_=+}{'?]+(\.[-a-zA-Z0-9~!$%^&amp;*_=+}{'?]+)*@([a-zA-Z0-9_][-a-zA-Z0-9_]*(\.[-a-zA-Z0-9_]+)*\.([cC][oO][mM]))(:[0-9]{1,5})?"
    

    问题是一些不该逃走的字符被逃走了,比如 ' ^ -

    还要注意,HTML5引擎将整个模式包装在 ^(?: )$ $ 绳尾锚定在模式的末端。

    测试:

    <form>
       <input type="email" name="p_email_ad" id="p_email_ad" value="" required="required" pattern="[-a-zA-Z0-9~!$%^&amp;*_=+}{'?]+(\.[-a-zA-Z0-9~!$%^&amp;*_=+}{'?]+)*@([a-zA-Z0-9_][-a-zA-Z0-9_]*(\.[-a-zA-Z0-9_]+)*\.([cC][oO][mM]))(:[0-9]{1,5})?" maxlength="64">
       <input type="Submit">
    </form>
        2
  •  0
  •   Matt K iain    6 年前

    我的简单解决方案是,在将正则表达式应用到输入的 pattern 属性。这似乎满足了HTML5引擎的要求,而且它的工作原理与预期一致。JavaScript的 encodeURIComponent 很适合。