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

Ada*_*dam 4 php regex preg-match

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

[A-Za-z0-9 _]{3,12}当我在文本编辑器中使用 string 测试匹配时test'ing,它会突出显示“test”和“ing”,但是当我在 PHP 中使用以下代码时:

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

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

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

提前致谢...

Ama*_*ali 6

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

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

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

进一步阅读: