首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP正则表达式最多允许1‘’或字符串中的“_”字符,以及“.”或“_”不能位于字符串的开头或结尾

PHP正则表达式最多允许1‘’或字符串中的“_”字符,以及“.”或“_”不能位于字符串的开头或结尾
EN

Stack Overflow用户
提问于 2011-07-04 10:12:43
回答 3查看 3.2K关注 0票数 2

我正在编写一个用户注册表单的PHP验证。我设置了一个函数来验证用户名,该函数使用与perl兼容的正则表达式。如何编辑它才能使正则表达式的一个要求最多只有一个。或_ character,但不允许该字符出现在字符串的开头或结尾?例如,像"abc.d“、"nicholas_smith”和"20z.e“这样的内容是有效的,但是像"abcd.”、"a_b.C“和"_nicholassmith”这样的内容都是无效的。

这是我目前所拥有的,但它没有添加关于的要求。和_字符。

代码语言:javascript
运行
复制
function isUsernameValid()
{
    if(preg_match("/^[A-Za-z0-9_\.]*(?=.{5,20}).*$/", $this->username))
    {
        return true; //Username is valid format
    }
    return false;
}

感谢您可能带来的任何帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-04 10:20:53

代码语言:javascript
运行
复制
if (preg_match("/^[a-zA-Z0-9]+[._]?[a-zA-Z0-9]+$/", $this->username)) {
    // there is at most one . or _, and it's not at the beginning or end
}

您可以将其与字符串长度检查结合使用:

代码语言:javascript
运行
复制
function isUsernameValid() {
    $length = strlen($this->username);
    if (5 <= $length && $length <= 20
    &&  preg_match("/^[a-zA-Z0-9]+[._]?[a-zA-Z0-9]+$/", $this->username)) {
        return true;
    }
    return false;
}

您可能只使用一个正则表达式就可以完成所有的工作,但是阅读起来会困难得多。

票数 6
EN

Stack Overflow用户

发布于 2011-07-04 10:22:21

您可以使用以下模式,我将其划分为多行,以使其更易于理解:

代码语言:javascript
运行
复制
$pattern = "";
$pattern.= "%";         // Start pattern
$pattern.= "[a-z0-9]+"; // Some alphanumeric chars, at least one.
$pattern.= "[\\._]";    // Contains exactly either one "_" or one "."
$pattern.= "[a-z0-9]+"; // Some alphanumeric chars, at least one.
$pattern.= "%i";        // End pattern, optionally case-insensetive

然后你可以在你的函数/方法中使用这个模式:

代码语言:javascript
运行
复制
function isUsernameValid() {
    // $pattern is defined here
    return preg_match($pattern, $this->username) > 0;
}
票数 0
EN

Stack Overflow用户

发布于 2011-07-05 11:25:46

下面是一个经过注释和测试的正则表达式,它强制执行最多5到20个字符的额外(未指定但隐含)长度要求:

代码语言:javascript
运行
复制
function isUsernameValid($username) {
    if (preg_match('/                      # Validate User Registration.
        ^                                  # Anchor to start of string.
        (?=[a-z0-9]+(?:[._][a-z0-9]+)?\z)  # One inner dot or underscore max.
        [a-z0-9._]{5,20}                   # Match from 5 to 20 valid chars.
        \z                                 # Anchor to end of string.
        /ix', $username)) {
        return true;
    }
    return false;
}

注意:不需要转义character类中的点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6566751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档