为什么这个正则表达式不能在PHP中以相同的方式验证?

Coo*_*ter 2 php regex preg-match

当我使用以下表达式尝试preg_match:时/.{0,5}/,它仍然匹配长度超过5个字符的字符串.但是,在尝试使用在线regexp匹配器时,它确实可以正常工作

Spu*_*ley 6

您引用的网站myregexp.com专注于Java.

Java具有用于匹配精确模式的特定功能,而无需使用锚字符.这是myregexp.com使用的功能.

在大多数其他语言,为了匹配的精确模式,您将需要添加锚文字^$分别在模式的开始和结束,否则正则表达式假设只需要在字符串中的某处找到匹配的模式,而而不是整个字符串是匹配.

这意味着没有锚点,你的模式将匹配任何长度的任何字符串,因为无论字符串如何,它都将在其中包含"零到五个任何字符"的匹配.

因此,在PHP,Perl以及几乎任何其他语言中,您需要将您的模式看起来像这样:

/^.{0,5}$/
Run Code Online (Sandbox Code Playgroud)

在解释了所有这些之后,我会做出一个最后的观察:这个特定的模式真的不需要是一个正则表达式 - 你可以用同样的东西来实现strlen().此外,正则表达式中的点字符可能无法完全按预期工作:它通常匹配几乎任何字符; 默认情况下会排除某些字符(包括换行符),因此如果您的字符串包含五个字符,但其中一个字符是新行,那么当您可能希望它通过时,它将使您的正则表达式失败.考虑到这一点,strlen()将是一个更安全的选择(或者mb_strlen()如果你希望有unicode字符).

如果你需要匹配正则表达式中的任何字符,并且点的默认行为不够好,有两个选项:一个是s在表达式的末尾添加修饰符(即它变为/^.{0,5}$/s).该s修饰符告诉正则表达式包括在点"任意字符"匹配换行符.

另一个选项(对于不支持s修饰符的语言很有用)是在字符类中使用表达式及其否定 - 例如[\s\S]- 而不是点.\s匹配任何空白字符,并且\S是负数\s,因此任何字符都不匹配\s.所以在角色类中它们匹配任何角色.它比一个圆点更长,更不易读,但在某些语言中,这是唯一确定的方法.

你可以在这里找到更多相关信息:http://www.regular-expressions.info/dot.html

希望有所帮助.