如何确定字符串是 PHP 中的电子邮件、ID 还是用户名


How can I determine whether a string is an email, id, or username in PHP?

我正在用PHP为我的管理面板编写一个成员搜索表单。 搜索条件只有一个字段,我希望脚本确定它是否应该在数据库中搜索电子邮件地址、用户名或 ID。 我当前的脚本始终返回该列为"display_name",即使我输入 ID 或电子邮件也是如此。 我做错了什么?

$criteria = "billgates@microsoft.com";
if(!preg_match("^([0-9]+)^", $criteria)){
            if(!preg_match("^([a-zA-Z0-9 ]+)^", $criteria)){
                if(!preg_match("^(['w-]+(?:'.['w-]+)*)@((?:['w-]+'.)*'w['w-]{0,66})'.([a-z]{2,6}(?:'.[a-z]{2})?)^", $criteria)){
                    $this->error = "Your search criteria of '".$criteria."'' is not a valid display name, email address, or ID.";
                } else {
                    $column = "email_address";
                }
            } else {
                $column = "display_name";
            }
        } else {
            $column = "user_id";
        }
echo $column;

以上将产生"display_name"。

嗨,

您可以简单地尝试此解决方案。 它对我有用。

<?php
$criteria = "billgates@microsoft.com";
if(!is_numeric($criteria)){
        if(filter_var($criteria, FILTER_VALIDATE_EMAIL)){            
            $column = "email_address";
        } else {
            $column = "display_name";
        }
    } else {
        $column = "user_id";
    }
echo $column;
?>

您的正则表达式使用"^"作为分隔符。事实上的标准分隔符是"/"。"^"匹配字符串的开头。如果要匹配末尾,则需要使用"$"。当然,在分隔符内部。

$criteria = "billgates@microsoft.com";
if(!filter_var($criteria, FILTER_VALIDATE_EMAIL) === false)
    $column = "email_address";
else if(is_numeric($criteria))
    $column = "display_name";
else
    $column = "user_id";
echo $column;

您的preg_match正则表达式中几乎没有错误。 检查下面的代码。

$criteria = "2312";
if (!preg_match("/^[1-9][0-9]*$/", $criteria)) {
    if (!preg_match("/^([a-zA-Z0-9 ]+)$/", $criteria)) {
        if (!preg_match("/^[_a-z0-9-]+('.[_a-z0-9-]+)*@[a-z0-9-]+('.[a-z0-9-]+)*('.[a-z]{2,})$/", $criteria)) {
            $this->error = "Your search criteria of '" . $criteria . "'' is not a valid display name, email address, or ID.";
        } else {
            $column = "email_address";
        }
    } else {
        $column = "display_name";
    }
} else {
    $column = "user_id";
}
echo $column;

检查工作 http://phpfiddle.org/main/code/2z65-4rdv

所以我得出的结论使用了每个人的回答。 我没有使用正则表达式,而是使用 PHP 函数 is_numeric、ctype_alnum 和过滤器来验证电子邮件,同时保持与旧代码相同的结构。 我不想通过说如果字符串不是 ID 或电子邮件,那么它是一个显示名称来消除对显示名称的验证。 这是因为显示名称遵循某种格式,可以使用该方法输入任何旧字符串。 这是我想出的...

if(!is_numeric($criteria)){
            if(!ctype_alnum($criteria)){
                if(!filter_var($criteria, FILTER_VALIDATE_EMAIL)){
                    $this->error = "Your search criteria of '".$criteria."'' is not a valid display name, email address, or ID.";
                } else {
                    $column = "email_address";
                }
            } else {
                $column = "display_name";
            }
        } else {
            $column = "user_id";
        }