2013-09-25 69 views
1

好的,所以我正在开发一个登录系统,并且我正在努力防止用户输入我不想要的,我的验证的一部分是确定用户名只是字母数字,以及密码,并对电子邮件进行单独验证。所以我发现了几个在php.net上使用的例子,因为在php中所有的东西,这些preg匹配的东西对我来说是毫无意义的。Preg_Match假结果

我遇到的问题是误报。前两个返回false为true,并且电子邮件验证按预期工作,但对于我的生活,我不知道为什么。我可以简单地删除!在前面强迫我的表达意图的答案,但我实际上想知道为什么两个语句构造几乎完全相同的返回不同的布尔值。

<?php 
$user = "testing2"; 
$pass = "testing1"; 
$email = "[email protected]"; 
    if (!preg_match('/[^A-Za-z0-9]+/', $user)) { 
     echo "Username must only contain English letters and numbers<br />"; 
    } 
    if (!preg_match('/[^A-Za-z0-9]+/', $pass)) { 
     echo "passw must only contain English letters and numbers<br />"; 
    } 
    if (!preg_match('/^([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*\@([a-z0-9])*(\.([a-z0-9])([-a-z0-9_-])([a-z0-9])+)*$/i', $email)) { 
     echo "Please use a valid email"; 
    } 
?> 
+3

*“passw只能包含英文字母和数字”* - 为什么? – Ryan

+0

因为我希望在使用精确过滤之前让代码正常工作。 – Pyro4816

+0

这里有一个函数密码检查:'if(strlen($ pass)<8){echo“passw太短,至少使用8个字符;越多越好。 }' –

回答

2

因为你的用户名和密码否定字符类,你应该删除的条件的否定:

if (preg_match('/[^A-Za-z0-9]/', $user)) { ... } 

上面的意思是“如果$user包含非字母数字的任何字符”,所以似乎是你想警告的。换句话说,你的前2个正则表达式实际上是,看起来为无效值。

由于^被用于否定前2个正则表达式中的字符类,但在电子邮件正则表达式中被用作锚点(字符串的开始),所以可能会引起混淆。

另一种方法是使第一正则表达式2与去年保持一致,并让他们只认准有效值:

if (!preg_match('/^[A-Za-z0-9]+$/', $user)) { ... } 

以上可以确保的$user每个字符为字母数字字符。

+0

任何人都有正则表达式分解的好地方吗?我已经搜索了一个,所有内容似乎都是为那些已经这么做了多年的人编写的,对我来说,我似乎无法理解他们。 – Pyro4816

+0

@ Pyro4816:http://docs.python.org/3.4/howto/regex.html#regex-howto – Ryan

+2

你应该拿掉'+',这是不必要的。 – Ryan

0

你可以做两个不同的东西:

认准正确的格式; 如果不是字符串只是数字字母的字符

if (!preg_match('/[A-Za-z0-9]+/', $user)) 

看的格式不正确; 如果字符串中包含非字母数字字符的char

if (preg_match('/[^A-Za-z0-9]/', $user)) 

你混他们两个!