Php 我需要一个正则表达式,它将输入限制为字母、数字和一些特殊字符,如newline

Php 我需要一个正则表达式,它将输入限制为字母、数字和一些特殊字符,如newline,php,regex,preg-match,Php,Regex,Preg Match,我希望将用户输入限制为包含2到1024个字母、数字、空格、句点、下划线、破折号、回车(新行)和制表符的字符串。回车和制表符在我的正则表达式中不起作用。我知道还有其他方法来检查长度 if (!preg_match('/^[a-zA-Z0-9 ._-\r\t]{2,1024}$/', $userstring)) { echo '<p>Bad string</p>'; } if(!preg_match('/^[a-zA-Z0-9.'-\r\t]{21024}$/',$

我希望将用户输入限制为包含2到1024个字母、数字、空格、句点、下划线、破折号、回车(新行)和制表符的字符串。回车和制表符在我的正则表达式中不起作用。我知道还有其他方法来检查长度

if (!preg_match('/^[a-zA-Z0-9 ._-\r\t]{2,1024}$/', $userstring))
{
    echo '<p>Bad string</p>';
}
if(!preg_match('/^[a-zA-Z0-9.'-\r\t]{21024}$/',$userstring))
{
回显“坏字符串”

; }
提前谢谢

页面上有一个带有控件的窗体

如果我键入:1CR2(即1后跟回车符,然后是2)并提交页面,将显示错误消息,框中将包含1rn2。

保留字符(包括
-
)需要用反斜杠(
\
)转义。请尝试以下正则表达式:
^[\w\s\.\-]{21024}$
<代码>\w匹配单词字符(
[a-zA-Z0-9\
)和
\s
匹配空白字符(
[\t\r\n\f]
)。这就给您留下了需要转义的
-
。最终PHP代码:

if (!preg_match('/^[\w\s.\-]{2,1024}$/', $userstring))
{
    echo '<p>Bad string</p>';
}
if(!preg\u match('/^[\w\s.\-]{21024}$/',$userstring))
{
回显“坏字符串”

; }
更多关于和的信息

编辑:
不需要在字符类(
[]
)中转义,谢谢Barmar。

尝试:

if (!preg_match("/^[a-zA-Z0-9 ._\-\n\t]{2,1024}$/", $userstring))
{
      echo '<p>Bad string</p>';
}
if(!preg_match(“/^[a-zA-Z0-9.\-\n\t]{21024}$/”,$userstring))
{
回显“坏字符串”

; }

我相信您会希望正则表达式用双引号括起来,以便换行符(您应该使用
\n
而不是
\r
)和制表符正确插入。另外,您应该转义
-
,因为它在括号内使用时用于定义范围。

当您试图匹配可能有换行符的字符串时,您需要使用。m将启用多行,例如:

if (!preg_match('/^[a-zA-Z0-9 ._-\r\t]{2,1024}/m', $userstring))
{
    echo '<p>Bad string</p>';
}
if(!preg_match('/^[a-zA-Z0-9.\r\t]{21024}/m',$userstring))
{
回显“坏字符串”

; }

如果尾部有空白,则还将删除
$
。其他人建议使用
\s
而不是
\r\t
对我来说似乎是合理的。

在regexp中有特殊意义的字符,如
-
需要用“\”转义,如果您想将它们视为不起作用的文字?您可能希望用反斜杠(
\.\u\-
)转义保留字符
-
)。另外,
\s
[\t\r\n\f]
)是
\r\t
@MarkBaker的一个很好的“空白”替代品,它们不必在字符类中转义。除了括号内有特殊含义的
-
。我尝试了“/^[a-zA-Z0-9\.\s\t\r\n\f]{03072}$/”,但也不起作用。错误信息会显示出来,如果我输入“一”,然后输入回车,然后输入“二”,我会在输入框中得到onentwo。
不需要在括号内转义,只需
-
@Barmar谢谢提醒,你每天都会学到一些新东西。我复制粘贴了那个正则表达式,但它不起作用。将显示错误消息,如果我键入“一”,然后键入回车,然后键入“二”,则会在输入框中得到onerntwo。我当然感谢你的帮助。你能用一个完整的例子更新你的问题吗?我刚试过,效果很好。太棒了。我在中复制了您的代码,并将其发布,但它不起作用。令人沮丧的。如果不是因为需要允许马车返回,我就可以自由回家了。谢谢你的帮助。单引号或双引号都没什么区别,但我很感谢你的帮助/^[a-zA-Z0-9\s\t\r\n\.\u\-\,]{03072}/m'工作正常。打得好\r\n没有必要。”/^[a-zA-Z0-9\s\t\.\u\-\,]{03072}/m'工作。但是,我使用mysqli\u real\u escape\u字符串导致“\r\n”字面上显示在文本区域中。我需要弄清楚如何把它们放回去。'/^[a-zA-Z0-9\s\t\.\u\-\,]{21024}/m'对我有用。谢谢大家!