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

时间:2011-07-23 19:34:37

标签: php regex preg-match

当我使用以下表达式/.{0,5}/尝试preg_match时,它仍匹配长度超过5个字符的字符串。 但是,在online regexp matcher

中尝试时,它确实可以正常工作

2 个答案:

答案 0 :(得分:6)

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

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

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

这意味着没有锚点,你的模式将匹配任何长度的任何字符串,因为无论字符串是什么,它都会在其中包含“零到五个任何字符”的匹配。

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

/^.{0,5}$/

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

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

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

您可以在此处找到有关此内容的更多信息:http://www.regular-expressions.info/dot.html

希望有所帮助。

答案 1 :(得分:4)

您需要使用^$来锚定它。这些符号分别与字符串的开头和结尾匹配,因此在开头和结尾之间必须是0-5个字符。离开锚点将匹配字符串中的任何位置,因此它可能更长。

/^.{0,5}$/

为了更好的可读性,我可能还会将.括在()中,但这有点主观。

/^(.){0,5}$/