Php 范围内的匹配点预匹配

Php 范围内的匹配点预匹配,php,regex,Php,Regex,我一直在尝试使用preg_match()匹配文字点,但正则表达式引擎在\.位置出现问题 这里出了什么问题,我该如何解决 /^[A-Za-z0-9_-\.]{3,16}$/ 您的字符类格式不正确。使用 /^[A-Za-z0-9_.-]{3,16}$/ 你正变得越来越聪明。不必在字符范围的最后位置转义连字符。如果在character类中使用它,则必须对其进行转义 在character类中,除了右括号]、反斜杠\、插入符号^和连字符-之外,几乎所有字符都被视为文字。(见附件) 非初始位置的插入符号

我一直在尝试使用
preg_match()
匹配文字点
,但正则表达式引擎在
\.
位置出现问题

这里出了什么问题,我该如何解决

/^[A-Za-z0-9_-\.]{3,16}$/

您的字符类格式不正确。使用

/^[A-Za-z0-9_.-]{3,16}$/
你正变得越来越聪明。不必在字符范围的最后位置转义连字符。如果在character类中使用它,则必须对其进行转义

在character类中,除了右括号
]
、反斜杠
\
、插入符号
^
和连字符
-
之外,几乎所有字符都被视为文字。(见附件)

非初始位置的插入符号也将被视为文字。如果
]
位于初始位置,则不必在PHP中转义(但必须在JavaScript中转义!)

发件人:

  • Perl在警告模式下为字符类发出警告 例如
    [A-\d]
    [A-[:digit:]
    。然后,它将连字符视为文字。PCRE没有警告功能,因此在这些情况下会出现错误,因为它们几乎肯定是用户的错误

  • 问题是在字符类中间存在未逃逸连字符。通过以下方式解决此问题:

    /^[A-Za-z0-9_.-]{3,16}$/
    

    如果连字符位于字符类的中间,那么是的,它需要被转义,但是如果它是在边上,那么它就不需要被转义,也不必像从我的正则表达式中看到的那样,也就不需要转义。因此,为了安全起见,在字符类的末尾或开始时总是使用连字符。少输入,少担心:)这些规则也适用于javascript吗?忘记点:它在字符类中根本不必转义,它将始终被视为一个文本
    。是的,JavaScript中应用了相同的规则。:)刚刚更新,我从您的答案中复制了正则表达式,并首先用连字符修复了关键问题。顺便问一下,这些规则也适用于javascript吗?