【问题标题】:Allow Underscores at the start and end of Usernames [duplicate]允许在用户名的开头和结尾使用下划线 [重复]
【发布时间】:2019-09-23 18:44:51
【问题描述】:

希望了解如何编辑用户名创建过程以允许在用户名的开头和结尾使用下划线和连字符。

目前,如果您以 _ 结尾用户名,则会将其从创建过程中删除。

$regex = '/^[A-Za-z0-9]+[A-Za-z0-9_.]*[A-Za-z0-9]+$/';
if(!preg_match($regex, $_POST['username'])) {
        $_SESSION['error'][] = $language->register->error_message->username_characters;
    }

【问题讨论】:

  • 您可以将[A-Za-z0-9] 部分替换为[A-Za-z0-9_]\w,但您也可以尝试'/^\w(?:[\w.]*\w)?$/'
  • 感谢维克托的回复! -- 将 [A-Za-z0-9_] 放在第一和第三位置有用吗?老实说,我并不完全熟悉这行代码中的实际操作/发生顺序。 -- 那么反过来,第一行应该是这样的? $regex = '/^[A-Za-z0-9_]+[A-Za-z0-9_.]*[A-Za-z0-9_]+$/';
  • 重点是您的正则表达式要求字符串至少有 2 个字符。我想 1 char 字符串也应该是有效的,不是吗?

标签: php sql regex


【解决方案1】:

您只需将下划线_ 和连字符- 添加到您的第一个和最后一个字符集,以允许您的用户名以这两个新字符开头或结尾并像这样编写您的正则表达式,

^[A-Za-z0-9_-]+[A-Za-z0-9_.]*[A-Za-z0-9_-]+$

因为\w 与写[a-zA-Z0-9_] 相同,因此您可以将正则表达式压缩为此,

^[\w-]+[\w.]*[\w-]+$

还想提一点,每当您在字符集中编写连字符 - 时,请确保始终将其作为字符集中的第一个或最后一个字符,否则在不知不觉中,连字符可能会起作用作为范围说明符,不能作为文字连字符。虽然和上面的正则表达式一样,字符集中只有\w-,因此我们不必担心连字符的位置。

Regex Demo

另外,我不确定您是否要允许只有一个字符的用户名(与通常只允许为一个字符的变量名不同),但如果您这样做,那么您可以将您的正则表达式修改为此,

^[\w-]+([\w.]*[\w-]+)?$

Regex Demo allowing just one character as username

【讨论】:

  • 所以最终结果应该是这样的?: $regex = '/^[\w-]+[\w.]*[\w-]+$/'; -- 想确定我是否需要斜线?
  • @LoboStylez:是的,没错。在 PHP 中,您将正则表达式写在引号中,并且在引号之后和引号之前,您需要编写正则表达式分隔符,因此您也需要编写 / 但如果您愿意,您可以将这些分隔符更改为 # 之类的其他内容或~,但您至少需要编写一些分隔符。通常,您希望选择一个不出现在正则表达式中的分隔符,否则您需要对其进行转义,因此为了避免在正则表达式中无用地转义字符,明智的做法是选择一个不出现在正则表达式中的分隔符。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多