我需要一个正则表达式,将输入限制为字母,数字和一些特殊的字符,如换行符

时间:2014-02-13 23:49:25

标签: php regex preg-match

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

if (!preg_match('/^[a-zA-Z0-9 ._-\r\t]{2,1024}$/', $userstring))
{
    echo '<p>Bad string</p>';
}

提前致谢。

页面上有一个带有控件的表单。

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

3 个答案:

答案 0 :(得分:0)

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

if (!preg_match('/^[\w\s.\-]{2,1024}$/', $userstring))
{
    echo '<p>Bad string</p>';
}

有关shorthand classesreserved characters的更多信息。

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

答案 1 :(得分:0)

尝试:

if (!preg_match("/^[a-zA-Z0-9 ._\-\n\t]{2,1024}$/", $userstring))
{
      echo '<p>Bad string</p>';
}

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

答案 2 :(得分:0)

当您尝试匹配可能包含换行符的字符串时,您需要使用Pattern Modifier在正则表达式中启用多行。 m将启用多行,例如:

if (!preg_match('/^[a-zA-Z0-9 ._-\r\t]{2,1024}/m', $userstring))
{
    echo '<p>Bad string</p>';
}

如果有空白空格,也会移除$。其他人使用\s代替\r\t的建议对我来说似乎是合理的。