我无法获得preg_match来测试整个字符串是否与正则表达式匹配

时间:2014-05-02 12:39:09

标签: php regex preg-match username

我使用此正则表达式来测试用户名是否有效:

[A-Za-z0-9 _]{3,12}当我在文本编辑器中使用字符串test'ing对匹配项进行测试时,会突出显示' test'并且',但是当我在PHP中使用以下代码时:

if(!preg_match('/[A-Za-z0-9 _]{3,12}/', $content)其中$ content是test'ing,它应该返回FALSE,它仍然返回true。

我的正则表达式有问题吗?我需要:

  • 最小长度3,最多12 {3,12}
  • 字符串前面或后面没有空格/下划线,并且在任何地方都没有空格/下划线 (我正在使用额外的检查,因为我对正则表达式并不是很好)
  • 只允许使用字母数字,空格和下划线[A-Za-z0-9 _]

提前致谢...

2 个答案:

答案 0 :(得分:2)

您应该添加开始和结束锚点(^$):

if(!preg_match('/^[A-Za-z0-9 _]{3,12}$/', $content)

主播^匹配字符串的开头,$匹配结尾。这样,它只会匹配整个字符串是否满足您的正则表达式。

希望有所帮助

答案 1 :(得分:2)

您在正则表达式中缺少锚点,因此正则表达式可以轻松匹配字符串中任何位置中的3个字符。这不是你想要的。您想要检查您的正则表达式是否与整个字符串匹配。为此,您需要包含锚点(^$)。

if(!preg_match('/^[A-Za-z0-9 _]{3,12}$/', $content)
                 ^                   ^

^断言字符串开头的位置,$断言字符串末尾的位置。重要的是要注意这些元字符实际上并不消耗字符。它们是零宽度断言。

进一步阅读: