注册脚本的预匹配 php

preg match for registration script php

我正在尝试进行一些预匹配以使我的脚本更安全,但是无论我输入什么 username/realname 我都会收到错误...我哪里出错了?

        $unpreg = $_POST["username"];
        $empreg = $_POST["email"];
        $rnpreg = $_POST["realname"];

        $error = false;
        if(preg_match("/[^\p{L}\p{N}_\-\.]+/iu','",$unpreg) || (filter_var($empreg, FILTER_SANITIZE_EMAIL)) || (preg_match("/[^\p{L}\s]+/u",$rnpreg))) {

            $error = true;
        }
        if(!$error) {

            $sql = "INSERT INTO Users (UserName, Email, Password,Real_Name) VALUES (:username, :email, :password, :realname)";
            $stmt = $conn->prepare($sql);

            $stmt->bindParam(':username',$unpreg);
            $stmt->bindParam(':realname',$rnpreg);
            $stmt->bindParam(':email', $empreg);
            $stmt->bindParam(':password', password_hash($_POST['password'], PASSWORD_BCRYPT));
            $stmt->execute();

            $message = 'Successfully created new user';

        } 
        else {

            $message = 'Error, Something went wrong.';
        }

基本上对于 unpreg 我想允许 a-ö 0-9 -_ 并且对于 rnpreg a-ö - 和 space

编辑:如果我删除 (filter_var($empreg, FILTER_SANITIZE_EMAIL)) 它会起作用...我如何在不破坏它的情况下实现它?

第一个正则表达式中的 ',' 是一个错误,必须删除。然后,您需要使用 FILTER_SANITIZE_EMAIL 而您需要 FILTER_VALIDATE_EMAIL 验证 电子邮件。并且您需要否定 filter_var,因为您遵循 if 中的否定逻辑。

使用

if(preg_match("/[^\p{L}\p{N}_.-]+/iu",$unpreg) || !filter_var($empreg, FILTER_VALIDATE_EMAIL) || preg_match("/[^\p{L}\s]+/u",$rnpreg))

因此,如果找到 [^\p{L}\p{N}_.-]+ 模式、电子邮件无效或匹配 [^\p{L}\s]+ 模式,将返回错误。