Javascript 浏览器是否支持不同的HTML5模式regexp功能?

Javascript 浏览器是否支持不同的HTML5模式regexp功能?,javascript,regex,html,pcre,Javascript,Regex,Html,Pcre,我在我们的网站上有一个面向客户的付款表单中有一个简单的正则表达式模式: <input type="text" pattern="(|\$)[0-9]*(|\.[0-9]{2})" title="Please enter a valid number in the amount field" required> 它的添加有助于在客户无法输入有效数字时,在进行服务器端验证之前快速通知客户 在四位客户打电话抱怨他们无法提交表单,因为他们的浏览器不断告诉他们输入的金额不正

我在我们的网站上有一个面向客户的付款表单中有一个简单的正则表达式模式:

<input type="text" pattern="(|\$)[0-9]*(|\.[0-9]{2})"
       title="Please enter a valid number in the amount field" required>

它的添加有助于在客户无法输入有效数字时,在进行服务器端验证之前快速通知客户

在四位客户打电话抱怨他们无法提交表单,因为他们的浏览器不断告诉他们输入的金额不正确后,我做了一些挖掘,发现IE10+不喜欢该表达式的背面——任何输入的金额不包括小数点都被接受,任何带有小数点的内容都被拒绝。该模式在我的开发环境(Chrome 30+)和Opera 12中都可以使用,但Firefox 27根本不会验证它

我读了那本书,上面写着:

如果指定,属性的值必须与JavaScript模式产品相匹配。[ECMA262]

由于支持
pattern
的浏览器只有一个,我想这包括了对所有Javascript正则表达式的完全支持


我在哪里可以了解更多关于不同浏览器中
模式
支持之间的怪癖?

这个问题似乎只是IE的一个bug。你对规范的链接相当死板,IE缺少一点:

。。。除了pattern属性与整个值匹配,而不仅仅是与任何子集匹配(有点像它暗示了一个^(?:在模式的开头,一个)$在模式的结尾)

实际上,您可以通过对自己的模式执行此操作来修复此错误,即:

^(?:(|\$)[0-9]*(|\.[0-9]{2}))$
这在IE9和IE10以及Chrome中对我有效。看

发生这种情况的技术原因有点复杂:

如果您阅读了第15.10.2.3节中的EMCA 5.1规范,它将讨论如何评估变更。基本上,
|
的每个“部分”都从左到右求值,直到找到一个匹配的部分。假设该值,除非“续集”中存在问题,在这种情况下,将评估备选方案中的其他可能性

IE所做的似乎是使用替换项的空部分匹配字符串的开头,它可以工作:
\$[digits][empty]
$12.12
的开头匹配到小数点。IE的正则表达式引擎(正确地)说这是一个匹配,因为子字符串匹配,并且没有被告知检查字符串的结尾

一旦正则表达式引擎(没有锚来强制整个字符串匹配)返回true,即存在匹配,Microsoft的一些工程师就抄近路,告诉
模式
属性也检查匹配的部分是否等于整个字符串,这就是失败的原因。引擎只匹配了字符串的一部分,尽管它本可以匹配更多,所以二次检查失败,认为最后有无关的输入

这个案子很微妙,所以我不太惊讶它以前没有被抓到过。我已经创建了一个bug报告,以查看是否有来自Microsoft的响应

这与EMCA规范相关的原因是,如果引擎被告知匹配整个字符串,那么当它到达小数点并尝试匹配替换的第二部分时,它就会回溯,找到并匹配
(\.[0-9{2})
,整个过程就会工作


现在,对于一些解决方法:

  • 将锚点
    ^(?:
    )$
    添加到您的模式中

  • 不要使用空的交替。就个人而言,我喜欢在这些情况下使用可选的
    $
    。您的模式将变成
    (\$?)[0-9]*(\.[0-9]{2})?
    ,并且会起作用,因为?是一个贪婪的匹配,引擎将尽可能使用整个字符串,而不是第一个匹配的交替

  • 交换替换项上的顺序。如果先测试较长的字符串,它将首先匹配,并首先使用。这在其他语言中出现-


PS:请注意数字的
*
。现在,“$”是一个有效的匹配项,因为
*
允许0个数字。我对完整正则表达式的建议是
(\$)?(\d+)(\.\d{2})?

,因为您的问题是“我在哪里可以了解更多关于不同浏览器中模式支持之间的怪癖?”我投票将此作为主题外的内容结束,因为它要求找到一个工具或参考。如果你能更新你的问题以询问具体的怪癖,我想它会在主题上。Javascript有自己的正则表达式引擎,不使用PCRE库。@Casimir:为你更新了措辞。@zzzzBov:我在这里联系的原因是我的公司lete无法通过谷歌挖掘任何东西。而且,鉴于SO在现代互联网信息领域中作为编程信息的摘要/存档的作用越来越大,我认为这样问是合适的。@Eirik,而问“一个具体的、可回答的问题”则是合适的,要求非现场参考资料是不合主题的,因为它鼓励只提供链接的答案,而在这些答案中很难选出一个是“正确的”,并且易受link-rot的攻击。哇。1:出于某种原因,我在编写JS REs时总是忘记使用字符类。2:因为没有人回答这个问题,而且我仍然找不到任何关于类似问题的信息,我同意这一定是IE错误。我接受你的回答,因为我疯了,所有浏览器都疯了,这似乎是合乎逻辑的应该有同样工作的正则表达式引擎。感谢您了解如何创建Microsoft bug,并与它们一起提出问题。3:您的上一个模式很漂亮。很好地捕捉到了
*
中有趣的匹配。