在preg_match中完全混淆了这个简单的正则表达式

时间:2013-05-30 09:16:42

标签: php regex validation preg-match

我正在尝试验证一些输入,但是我得到反向结果(或者我完全错过了使用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找到匹配?我已经检查了文档,但我不明白发生了什么。

我真正的要求是在用户输入中允许短划线字符( - )和字母数字字符,但是当我的基本测试看起来不起作用时,我看不到如何到达任何地方。

修改

感谢您的回复!我现在得到了插入符号的问题。但是我忘了提到除了破折号之外,我还需要允许空格。

5 个答案:

答案 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