我正在尝试验证一些输入,但是我得到反向结果(或者我完全错过了使用preg_match
函数?)
这是我的代码:
$check_firstname = "@#";
if(preg_match('/[^A-Za-z0-9_]/', $check_firstname)) echo "valid"; else echo "invalid";
我原以为preg_match
中的这个正则表达式不仅会允许使用字母数字字符,而且这个输入会输出valid
!如果输入(在这种情况下,check_firstname
)不是字母数字,为什么preg_match
找到匹配?我已经检查了文档,但我不明白发生了什么。
我真正的要求是在用户输入中允许短划线字符( - )和字母数字字符,但是当我的基本测试看起来不起作用时,我看不到如何到达任何地方。
感谢您的回复!我现在得到了插入符号的问题。但是我忘了提到除了破折号之外,我还需要允许空格。
答案 0 :(得分:3)
当你在括号内时,你使用的是^
符号,意思是“不是”。这是一个good site on syntax for Regex.在单行模式下,\s
允许使用制表符和空格。 注意:连字符需要最后一个,所以它不会尝试将其视为一个范围。
if(preg_match('/^[A-Z0-9\s-]+$/i', $check_firstname)){
echo "valid"; } else {echo "invalid";}
答案 1 :(得分:1)
试试这个:
if(preg_match('/^[A-Za-z0-9_]+$/', $check_firstname)===1){ echo 'Valid'; } else { echo 'Invalid'; }
放置^字符的位置不正确,还添加了$符号以表示匹配结束。
您还应该使用类型/值比较,因为此函数可以返回3个不同的值:
(int)1 = Match found
(int)0 = Match not found
(bool)false = Error
答案 2 :(得分:1)
您只需将插入符号(^
)放在错误的位置:)
[^...]
匹配方括号中找到的 字符。
^
单独表示字符串的开头。
[^A-Za-z0-9_]
表示正则表达式将检查字符串中的第一个字符,如果该字符不是字母数字或下划线,则它将通过。
要仅允许使用字母数字字符和短划线,您将使用:
^[A-Za-z0-9-]+$
+
(一次或多次)和$
(字符串结尾)运算符将确保检查整个字符串。
请注意,此正则表达式不允许使用下划线(_
)。如果你需要允许它们,你可以在Casimir的答案中使用正则表达式。
也允许空格:
^[A-Za-z0-9\s-]+$
答案 3 :(得分:1)
你可以用这个:
if(preg_match('/^[\w- ]+$/', $check_firstname)) echo "valid"; else echo "invalid";
答案 4 :(得分:0)
为什么不坚持你的正则表达式并改变解释?
if(preg_match('/[^A-Za-z0-9_]/', $check_firstname)) echo "invalid"; else echo "valid";
如果正则表达式匹配,您知道$ check_firstname包含至少一个不是字母,数字或下划线的字符 - >这使它无效
QED