仅限长度的正则表达式 - 任意字符

7
我试图使用正则表达式来限制文本框中的字符数在4至138个之间。
我的正则表达式是这样的:'/^.{4,138}$/' 但是,我希望用户能够包含回车符,然而我认为“.”会阻止它们的输入。你有什么好的解决方法吗?
编辑:
显然,还有其他获取文本长度的方法,比如strlen等等,但由于需要使用插件进行检查(即需要正则表达式),我正在寻找正则表达式。
4个回答

7

我希望用户能够包含换行符,但是我认为“.”会阻止他们这样做。你认为我需要改变什么?

可以采用以下两种方式之一:

  • . 改为 [\s\S] (空格和换行符属于 \s,其他字符属于 \S)
  • 使用 SINGLE_LINE(也称为 DOTALL)正则表达式标志 /…/s

6
为什么不使用 strlen 函数来检查字符串长度呢?这比使用正则表达式要更高效。此外,您还可以提供有意义的错误消息。
$length = strlen($input);

if ($length > 138)
   print 'string too long';
else if ($length < 4)
   print 'string too short';

这是通过插件创建的代码 - 如果将其更改为非正则表达式,我将不得不重写插件。 - Dave
1
@Dave:由于这个问题在SO上经常出现,所以答案可以预料。许多人倾向于迷失在正则表达式的可能性中,并试图用它来解决任何问题,因此经常需要将他们拉回现实。 - Tomalak
@Daniel - 他们所有的验证都需要正则表达式,因此,他们没有理由改变它,以防有人想要搞乱它来进行非正则表达式检查。 - Dave
2
@Dave:一般来说,可以安全地假设OP并不是真正询问他想要什么,而是他认为自己想要什么。以“你为什么不只是...”风格的替代答案并不是什么坏事。毕竟,在问题中你并没有说明正则表达式是你唯一的选择。 - Tomalak
1
ASP.NET在验证方面有类似的功能。您可以编写一个CustomValidator来检查字符串长度,但是使用一个具有类似正则表达式的RegularExpressionValidator会更简单和更短。然而,我同意@Tomalak的观点,"你为什么不只是..."这样的回答可能是有帮助且值得的。 - Justin Morgan
显示剩余2条评论

2

无论是

/^.{4,138}$/s

或者
/^[\s\S]{4,138}$/ 

将匹配换行符。

s 标志告诉引擎将整个内容视为单行,所以 . 将匹配 \n 以及它通常匹配的内容。请注意,这也会导致 ^$ 匹配整个字符串的开头和结尾(而不仅仅是每行的开头/结尾),除非您还使用了 m 标志。

这里有更多关于正则表达式标志的信息。


1

尝试使用'/^.{%d,%d}$/s',以使.也匹配换行符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接