【问题标题】:php regex validationphp正则表达式验证
【发布时间】:2010-09-19 20:33:41
【问题描述】:

只是一个简单的问题,正则表达式有点乱,所以我想我会在这里发帖。下面的正则表达式用于验证用户名。

  • 长度必须在 4-26 个字符之间

  • 至少以 2 个字母开头

  • 只能包含数字和一个 下划线和一个点

到目前为止我有这个,但没有工作

<?php

$username=$_POST['username'];

if (!eregi("^([a-zA-Z][0-9_.]){4,26}$",$username))
{
 return false;
}
else
{
 echo "username ok";
}

?>

谢谢:)

【问题讨论】:

  • preg_match 是执行正则表达式匹配的首选方式。 eregi 自 PHP 5.3 起已弃用,“强烈反对”使用它:php.net/eregi
  • 没有,谢谢你的链接
  • 请给出一些有效和无效用户名的例子。您的规则是矛盾的(至少 2 个字母与只有数字)。

标签: php regex


【解决方案1】:

你可以使用正则表达式

/^(?=[a-z]{2})(?=.{4,26})(?=[^.]*\.?[^.]*$)(?=[^_]*_?[^_]*$)[\w.]+$/iD

<?php

$username=$_POST['username'];

if (!preg_match('/^(?=[a-z]{2})(?=.{4,26})(?=[^.]*\.?[^.]*$)(?=[^_]*_?[^_]*$)[\w.]+$/iD',
                $username))
{
 return false;
}
else
{
 echo "username ok";
}

?>
  • ^(?=[a-z]{2}) 确保字符串“以至少 2 个字母开头”。
  • (?=.{4,26}) 确保其“长度必须介于 4-26 个字符之间”。
  • (?=[^.]*\.?[^.]*$) 确保以下字符最多包含一个 . 直到结尾。
  • 同样(?=[^_]*_?[^_]*$) 保证最多有一个_
  • [\w.]+$ 提交匹配。它还确保仅涉及字母数字 _.

(注意:此正则表达式假定 hello_world 是有效的用户名。)

【讨论】:

  • 让它以两个以上的字母开头,这将是完美的 :) “以 至少 2 个字母开头”。
  • 但同时它只能包含数字,所以最后一个字符必须只有“\d._”,并且第一部分不能有任何数字。这是基于您以前的正则表达式的一个:
  • /^(?=.{4,26})(?=[az]{2,}[^az]*$)(?=[^.]*\.?[^ .]*$)(?=[^.]*\.?[^.]*$)(?=[^_]*_?[^_]*$)[\w._]*$/i - 每个lookhead都按照要求的约束顺序。
  • 我已经做了:^(([a-z]{2})([a-z0-9]{2,24}))$,除了我无法让单个点工作之外,它工作得很好。任何想延长的人都可以继续。
  • 不要忘记添加/D 修饰符。这很重要,因为$ 将允许字符串中的最后一个换行符,例如"eviluser\n".
【解决方案2】:

您在一个正则表达式中要求很多,这可能是可能的,但这不是最好的方法,您想让用户知道他们的用户名错误的原因。

function checkUsername($username) {
    $username = trim($username);
    if (empty($username)) {
        return "username was left blank.";
    }elseif (strlen($username) < 4) {
        return "username was too short";
    }elseif (strlen($username) > 26) {
        return "username was too long";
    }elseif (!preg_match('~^[a-z]{2}~i', $username)) {
        return "username must start with two letters";
    }elseif (preg_match('~[^a-z0-9_.]+~i', $username)) {
        return "username contains invalid characters.";
    }elseif (substr_count($username, ".") > 1) {
        return "username may only contain one or less periods.";
    }elseif (substr_count($username, "_") > 1) {
        return "username may only contain one or less underscores.";
    }

    return true;
} 

然后检查你会做什么:

$validUsername = checkUsername($username);

if ($validusername !== true) {
     echo "An error occured: " . $validUsername;
}

通过这种方式,用户知道存在错误并可以更轻松地修复它,而不是对错误是什么视而不见。此外,您应该停止使用ereg,它已被贬值使用preg_match

注意使用 !== 进行检查,这也检查类型,因为它可以返回一个字符串(通过松散比较返回 true)。仅供参考。

【讨论】:

  • 谢谢,它只回显了“用户名正常”,因为它被发送回了 jquery 函数。我确实有用户名需要的要求列表,但我想你的方式更好。我会先给它:)
  • 添加了 2 个首字母要求。
  • preg_match('~[a-z0-9_.]+~i', $username) 将为foo@bar 返回1,因为[a-z0-9_.]+ 匹配foo
  • 感谢您发现这一点,添加了开始和结束锚点来修复它。
  • 我测试了它,工作正常,但如果我有下划线和句点就不起作用。我也可以有特殊字符,例如 '# [ ] ` 等
【解决方案3】:

你说的那部分:

一个下划线和一个点

老实说,会引导我远离正则表达式!

我会这样做:

if(!eregi('^[a-zA-Z]{2}$', substr(0,2))) {
    // .... check for only 2 dots here later ....
}

【讨论】:

  • 只是因为此时编写一些for/else 代码要容易得多。我确定它有一个正则表达式,但它会很复杂!
  • ☢☢☢ 2020 / php.net:“警告此函数在 PHP 5.3.0 中已弃用,在 PHP 7.0.0 中已删除。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多