我使用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 {
这是我正在使用的代码。
由于
答案 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个以上的字母数字字符字符串。