【问题标题】:PHP regular expression for alphanumeric and hypen input用于字母数字和连字符输入的 PHP 正则表达式
【发布时间】:2011-05-09 06:32:38
【问题描述】:

是否可以根据输入是否仅包含字母、数字和连字符的组合来验证输入(其中连字符不连续重复两次并且不开始/结束字符串)?

感谢Validate username as alphanumeric with underscores

我知道以下内容会根据带有下划线的字母数字输入验证字符串,是否可以更改此设置?

function validate_alphanumeric_underscore($str) 
{
    return preg_match('/^[a-zA-Z0-9_]+$/',$str);
}

提前感谢您的帮助!

【问题讨论】:

    标签: php regex


    【解决方案1】:

    这可以很容易地用一个正则表达式来完成:

    /^([a-z0-9]+-)*[a-z0-9]+$/i
    

    这符合您的所有条件:

    • 没有双连字符
    • 没有开始/结束连字符
    • 在 strlen == 1 时有效

    匹配:

    不匹配:

    与它一起玩here

    【讨论】:

    • 你赢了。(15 字符填充)
    • +1。其他答案可能有效,但它们都比它们需要的复杂得多。不过,我确实想知道,为什么这么多人选择将可选部分放在首位。 /^[a-z0-9]+(?:-[a-z0-9]+)*$/i 对我来说似乎更清晰,而且效率更高。
    【解决方案2】:

    假设至少 2 个字符:

    这将验证一般格式(不以 - 开头或结尾)。

    /^[a-z0-9][a-z0-9-]*[a-z0-9]$/i
    

    然后使用strpos添加一个简单的双连字符检查(如果为假,则字符串中没有--,所以我们要返回true。否则,我们要返回false,所以这就是为什么false === 在那里):

    false === strpos($string, '--');
    

    所以,你可以这样做:

    function validateAlphaNumericUnderscore($string) {
        if (0 < preg_match('/^[a-z0-9][a-z0-9-]*[a-z0-9]$/i', $string)) {
            return false === strpos($string, '--');
        }
        return false;
    }
    

    现在,我确信有一种方法可以在单个正则表达式中完成(不需要额外的 strpos),但我现在对此一无所知。这是一个简单的正则表达式和一个简单的第二个字符串比较(非基于正则表达式)。

    希望这能满足您的需求...

    编辑:事实上,您可以通过首先检查-- 来提高效率(因为字符串函数比正则表达式便宜):

    function validateAlphaNumericUnderscore($string) {
        if (false === strpos($string, '--')
            return 0 < preg_match('/^[a-z0-9][a-z0-9-]*[a-z0-9]$/i', $string);
        }
        return false;
    }
    

    【讨论】:

    • @Mark:请务必单击答案旁边的勾号以接受它。每个问题您只能接受一个答案。
    【解决方案3】:

    ircmaxell's answer 使用正则表达式和 strpos() 检查,这是我更喜欢的答案,但这是我使用单个正则表达式的方法。免责声明:这有很大的改进空间

    function validate_alphanumeric_hyphenated($str) 
    {
        /* 
         * Match either one or more alphanumeric characters, or a sequence with
         * a series of alphanumeric characters without consecutive, leading
         * or trailing hyphens.
         * 
         * Is probably unnecessarily long.
         */
        return preg_match("/^(?:[a-zA-Z0-9]+|[a-zA-Z0-9](?:[a-zA-Z0-9]|-(?!-))*[a-zA-Z0-9])$/", $str);
    }
    

    【讨论】:

    • +1 或单一的正则表达式解决方案...我不得不承认,我花了几分钟才弄清楚它是如何工作的(而且我通常很擅长正则表达式!),但它看起来对我来说是钱!不错!
    • @ircmaxell:谢谢!我碰巧正在用我的一些正则表达式答案练习环视语法,所以我的可能会变得不必要的长,正如 meagar 所证明的那样:)
    【解决方案4】:

    你可以用两个正则表达式来做到这一点:

    if( !preg_match('/(?:^-|-$|-{2,})/',$str) && preg_match(/^[a-zA-Z0-9_]+$/',$str) ) {
         return true;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多