如果else语句与preg_match不起作用

时间:2016-08-05 19:52:54

标签: php regex

我正在检查表单中的登录名和密码。它不应该包含任何特殊的字符。 评论return var_dump正确显示了登录名和密码值。 遗憾的是,ifelse都没有返回。 为什么会这样?

$usernCheck = $_POST['usern'];
$passCheck = $_POST['passn'];
// return var_dump($usernCheck.$passCheck);

if( (preg_match("!@#$%^&*()_+-=,./<>?;':\"{}[]", $usernCheck) !== false) 
    OR (preg_match("!@#$%^&*()_+-=,./<>?;':\"{}[]", $passCheck) !== false) ){
    return "Found special chars.";
} else {
    return "Not found special chars.";
}

1 个答案:

答案 0 :(得分:1)

如果发生错误,

preg_match仅返回false。如果模式不匹配,它将返回0,因此使用!== false可能不是一个好的比较,因为0 == false(相等),0 !== false(身份)。

如果没有完全检查你的正则表达式,我建议只让preg_match的返回值计算为布尔值。如果找到匹配项,它将返回1,这将评估为真。

if( preg_match($pattern, $usernCheck) || preg_match($pattern, $passCheck) {
    return "Found special chars.";
} else {
    return "Not found special chars.";
}

稍微检查一下你的正则表达式后,看起来很多字符在regex中有意义,需要进行转义,字符集应该包含在[]中以匹配 any 列表中的字符,而不是所有。类似的东西:

'[!@#\$%\^\&\*\(\)_\+-=,\.\/<>\?;\':\"{}\[\]]'

但可能还有其他特殊字符。最好指定允许哪些字符 ,而不是将特定字符列入黑名单。