preg_match - 只允许一个破折号

时间:2017-04-25 13:02:17

标签: php preg-match

我使用preg_match并且正在努力允许;数字,字母和短划线。但我想将破折号限制为1。我尝试在破折号之前和之后添加了{1},但它仍然允许不止一个。我做错了什么?

if (!preg_match("/^[A-Za-z0-9-]+$/", $username)) {
                $nameErr = "The username you selected was invalid.<br>Valid characters are dashes (one only), letters and numbers.";
            } else {

这是我正在使用的代码。

由于

2 个答案:

答案 0 :(得分:1)

对短划线计数进行额外测试以保持简洁。

if (!preg_match("/^[A-Za-z0-9\-]+$/", $username) || substr_count($username,'-') > 1) {
  $nameErr = "The username you selected was invalid.<br>Valid characters are dashes (one only), letters and numbers.";
}

答案 1 :(得分:1)

由于您似乎验证了一个字符串,该字符串可以在字母数字字符串中包含一个或零个连字符,因此如果找到了2个连字符,您可以在模式中使用否定前瞻来使匹配失败:

"/^(?![^-]*-[^-]*-)[A-Za-z0-9-]+$/D"
   ^^^^^^^^^^^^^^^^

模式详细信息

  • ^ - 字符串的开头
  • (?![^-]*-[^-]*-) - 如果有2个连字符用0+分隔,则匹配失败 除-
  • 以外的字符
  • [A-Za-z0-9-]+ - 一个或多个字母数字字符或连字符
  • $ - 字符串的最后一部分(使用/D修饰符后)。

请参阅regex demo(修改后的模式以考虑多行字符串输入)。

请注意,如果您想禁止-出现在字符串的开头/结尾以及几个连续的-,请使用更直接的模式:

"/^[A-Za-z0-9]+(?:-[A-Za-z0-9]+)?$/D"

其中^[A-Za-z0-9]+将匹配搅拌开始时的1个以上字母数字字符,(?:-[A-Za-z0-9]+)?$将匹配-的1或0次出现,最后匹配1个以上的字母数字字符字符串。