Php 正则表达式帮助:逗号分隔列表

Php 正则表达式帮助:逗号分隔列表,php,regex,Php,Regex,我正在尝试(用php) 验证textarea的内容是否有效 将它们分离到令牌中进行处理 为了被认为是有效的,它需要是一个字符串,只包含构成“代码”的数字和字母,长度在3-6之间,以及用于分隔它们的逗号。我把它分解成这样的东西: [A-Za-z0-9]{3,6}, 但是我完成它有困难。我希望它们能够用逗号分隔,或者用空格和逗号空格、逗号空格等分隔。我只希望在有以下有效标记的情况下有一个逗号 例如,输入字符串: abe 123,PlE43,54drt,r2344 应分为以下标记: “abe 123

我正在尝试(用php)

  • 验证textarea的内容是否有效
  • 将它们分离到令牌中进行处理
  • 为了被认为是有效的,它需要是一个字符串,只包含构成“代码”的数字和字母,长度在3-6之间,以及用于分隔它们的逗号。我把它分解成这样的东西:

    [A-Za-z0-9]{3,6},
    
    但是我完成它有困难。我希望它们能够用逗号分隔,或者用空格和逗号空格、逗号空格等分隔。我只希望在有以下有效标记的情况下有一个逗号

    例如,输入字符串:

    abe 123,PlE43,54drt,r2344

    应分为以下标记:

    “abe 123”和“PlE43”以及“54drt”和“r2344”


    我如何修改正则表达式以适应条件?(现在我很难让逗号成为可选的,但如果它存在,我希望另一个有效的标记,以及使用逗号和逗号之前或之后的任何空格组合作为有效分隔符)

    假设您要折叠所有空格(即,应忽略标记内的空格和标记之间/逗号旁边的空格),通过一些预处理,您可以做得更简单

    $input = 'abe 123, PlE43,54drt , r2344';
    $input = str_replace(' ', '', $input); // strip all spaces
    $tokens = explode(',', $input);
    foreach ($tokens as $token) {
        if(!preg_match('/^[A-Za-z0-9]{3,6}$/', $token)) {
            // error
        }
    }
    
    如果您有两个连续的逗号,或者输入字符串以逗号结尾,则此代码也会报告错误,因为这将在
    $tokens
    中生成一个空元素,该元素不会通过3到6字母数字规则进行验证

    更新:要保留令牌内的空格,需要稍作修改:

    $input = 'abe 123, PlE43,54drt , r2344';
    $tokens = explode(',', $input);
    foreach ($tokens as &$token) {
        $token = trim($token);
        if(!preg_match('/^[A-Za-z0-9]{3,6}$/', str_replace(' ', '', $token))) {
            // error
        }
    }
    
    但要小心,因为它认为

     a         b                       42
    

    是一个有效的令牌。

    假设要折叠所有空格(即,令牌内的空格和令牌之间的空格/逗号旁的空格都应忽略),则可以通过一些预处理简单得多

    $input = 'abe 123, PlE43,54drt , r2344';
    $input = str_replace(' ', '', $input); // strip all spaces
    $tokens = explode(',', $input);
    foreach ($tokens as $token) {
        if(!preg_match('/^[A-Za-z0-9]{3,6}$/', $token)) {
            // error
        }
    }
    
    如果您有两个连续的逗号,或者输入字符串以逗号结尾,则此代码也会报告错误,因为这将在
    $tokens
    中生成一个空元素,该元素不会通过3到6字母数字规则进行验证

    更新:要保留令牌内的空格,需要稍作修改:

    $input = 'abe 123, PlE43,54drt , r2344';
    $tokens = explode(',', $input);
    foreach ($tokens as &$token) {
        $token = trim($token);
        if(!preg_match('/^[A-Za-z0-9]{3,6}$/', str_replace(' ', '', $token))) {
            // error
        }
    }
    
    但要小心,因为它认为

     a         b                       42
    
    是一个有效的令牌。

    请尝试以下操作:

    [A-Za-z0-9]{3,6}((\s*\,\s*)[A-Za-z0-9]{3,6}|(\s)*)
    
    试试这个:

    [A-Za-z0-9]{3,6}((\s*\,\s*)[A-Za-z0-9]{3,6}|(\s)*)
    

    这个regexp可以完成这项工作

    ^([A-Za-z0-9]{3,6} *, *)*[A-Za-z0-9]{3,6}$
    
    它首先查找任意数量的令牌,然后查找sperator。然后它需要一个令牌。 在这种情况下,逗号前后允许有任意数量的空格。你可能想调整一下


    您的示例将不匹配,因为它在第一个标记中包含一个空格(不带逗号)。如果希望它通过,则应将空格添加到有效字符标记列表中

    这个regexp可以完成这项工作

    ^([A-Za-z0-9]{3,6} *, *)*[A-Za-z0-9]{3,6}$
    
    它首先查找任意数量的令牌,然后查找sperator。然后它需要一个令牌。 在这种情况下,逗号前后允许有任意数量的空格。你可能想调整一下

    您的示例将不匹配,因为它在第一个标记中包含一个空格(不带逗号)。如果希望它通过,则应将空格添加到有效字符标记列表中

    我会使用以下方法:

    /^(?:([A-Za-z0-9\s]{3,6})\s*(?:,\s*|$))*/
    
    这将把每个textarea的内容放入捕获组1。请注意,我已将您的
    [A-Za-z0-9]
    修改为
    [A-Za-z0-9\s]
    ,这将允许在您的
    abe 123
    示例中使用空格。这也将删除逗号周围的空白

    请注意,这不会从字符串的开头和结尾修剪空白。我建议你也修剪一下,以保持一致性。这样做的正则表达式是:

    /^(?:\s*([A-Za-z0-9\s]{3,6})\s*(?:,|$))*/
    
    还有一个更新:如果要忽略3-6个字符计数中的空格,可以执行以下操作:

    /^(?:((?:\s*[A-Za-z0-9]\s*){3,6})(?:,|$))*/
    
    使用您的示例数据进行测试:

    我将使用以下方法:

    /^(?:([A-Za-z0-9\s]{3,6})\s*(?:,\s*|$))*/
    
    这将把每个textarea的内容放入捕获组1。请注意,我已将您的
    [A-Za-z0-9]
    修改为
    [A-Za-z0-9\s]
    ,这将允许在您的
    abe 123
    示例中使用空格。这也将删除逗号周围的空白

    请注意,这不会从字符串的开头和结尾修剪空白。我建议你也修剪一下,以保持一致性。这样做的正则表达式是:

    /^(?:\s*([A-Za-z0-9\s]{3,6})\s*(?:,|$))*/
    
    还有一个更新:如果要忽略3-6个字符计数中的空格,可以执行以下操作:

    /^(?:((?:\s*[A-Za-z0-9]\s*){3,6})(?:,|$))*/
    
    使用示例数据进行测试:

    假设需求:

    • 每个令牌由字母、数字和空格组成,但必须包含至少一个字母和至少一个数字
    • 令牌的总长度为3-6个字符,其中包括任何内部空格
    • 假定3-6字符长度限制包括任何空格。(因此,包含7个字符的“abe 123”将无效。)
    • 考虑到分隔标记的逗号可能有可选的空格(可忽略),这意味着标记可能永远不会以空格开头或结尾(但可能包含嵌入的空格)
    下面是一个经过测试的PHP函数,它验证给定字符串并返回一个包含有效令牌的数组。如果字符串无效,则返回false

    //如果$text无效,则返回有效令牌数组,否则返回false。
    函数有效\u令牌($text){
    $re\u/
    #验证逗号分隔的文本区域“代码”标记。
    ^#锚定至管柱起点。
    \s*+#可选的前导空格。
    (?:#将逗号分隔的标记分组。
    (?=[0-9]{0,5}[A-Za-z])#必须至少包含一个字母。
    (?=[A-Za-z]{0,5}[0-9])#必须至少包含一个数字。
    [A-Za-z0-9]#第一个字符是数字或数字。
    [A-Za-z0-9]{1,4}#中间字符数、数字或空格。
    [A-Za-z0-9]#最后一个字符是数字或