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

uz75evzq  于 2023-05-05  发布在  PHP
关注(0)|答案(5)|浏览(198)

我正在尝试(在PHP中)
1.验证文本区域的内容是否有效
1.将它们分离到令牌中进行处理
为了被认为是有效的,它需要是一个只包含数字和字母的字符串,这些数字和字母构成一个长度为3-6的“代码”,并使用逗号分隔它们。我把它分解成这样:

[A-Za-z0-9]{3,6},

我有麻烦完成它虽然。我希望它们能够用逗号分隔,或者空格和逗号空格,逗号空格等。我只希望有一个逗号,如果有一个以下的有效令牌。
例如,输入字符串:
abe 123,PlE43,54drt,r2344
应分为以下标记:
'abe 123'和'PlE 43'和'54 drt'和'r2344'
我如何修复正则表达式以满足条件?(现在我在使逗号可选时遇到了麻烦,但如果它在那里,我希望另一个有效的标记,以及使用逗号和任何前后空格组合作为有效的分隔符)

lrl1mhuk

lrl1mhuk1#

假设你想折叠所有空格(即,标记内的空格和标记之间/逗号旁边的空格都应该被忽略),你可以通过一些预处理来更简单地完成它。

$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的字母数字规则。
See it in action

更新:为了保留令牌内的空格,需要稍微修改一下:

$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

是一个有效令牌。

tag5nh1u

tag5nh1u2#

假设要求:

  • 每个标记由字母、数字和空格组成,但必须包含至少一个字母和至少一个数字。
  • 令牌的总长度为3-6个字符,其中包括任何内部空格。
  • 假设3-6个字符长度限制包括任何空格。(因此:“abe 123”,它有7个字符,将是无效的。
  • 假定分隔标记的逗号可以具有可选的空格(其将被忽略),则暗示标记可以永远不以空格开始或结束(但可以包含嵌入的空格)。

下面是一个经过测试的PHP函数,它验证给定的字符串并返回一个包含有效令牌的数组。如果字符串无效,则返回false。

// Return array of valid tokens else false if $text is invalid.
function valid_tokens($text) {
    $re_validate = '/
        # Validate comma separated TEXTAREA "Codes" tokens.
        ^                          # Anchor to start of string.
        \s*+                       # Optional leading whitespace.
        (?:                        # Group comma separated tokens.
          (?=[0-9 ]{0,5}[A-Za-z])  # Must contain at least one letter.
          (?=[A-Za-z ]{0,5}[0-9])  # Must contain at least one digit.
          [A-Za-z0-9]              # First char is number or digit.
          [A-Za-z0-9 ]{1,4}        # Middle chars numbers, digits or spaces.
          [A-Za-z0-9]              # Last char is number or digit.
          \s*                      # Optional whitespace following token.
          (?:                      # Group for "end of token" options.
            ,\s*                   # Either a comma, optional whitespace,
          | $                      # or end of string.
          )                        # End "end of token" options group.
        )++                        # One or more tokens required.
        $                          # Anchor to end of string.
        /x';
    // Check validity of comma separated tokens (tokens may contain spaces).
    if (preg_match($re_validate, $text)) {
        $re_match = '/
            # Match next comma separated token. Capture in group $1.
            \s*+                 # Discard optional leading whitespace.
            (                    # $1: Comma separated token.
              [A-Za-z0-9]        # First char is number or digit.
              [A-Za-z0-9 ]{1,4}  # Middle chars numbers, digits or spaces.
              [A-Za-z0-9]        # Last char is number or digit.
            )                    # End $1: Comma separated token.
            \s* ,?               # Discard comma separator if its there.
            /x';
        preg_match_all($re_match, $text, $matches);
        return $matches[1]; // Return array of valid tokens.
    }
    // Case 2: TEXTAREA does not contain valid tokens. Return false.
    else return FALSE;
}

这个脚本使用两个主要的正则表达式;一个用于验证逗号分隔的令牌的整个字符串,另一个用于提取每个值。

****************************这个简化版本只允许逗号分隔的标记。

i5desfxk

i5desfxk3#

试试这个:

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

lnlaulya4#

这个正则表达式可以完成这项工作。

^([A-Za-z0-9]{3,6} *, *)*[A-Za-z0-9]{3,6}$

它首先查找任意数量的标记,然后是sperator。然后它期望单个令牌。在这种情况下,逗号前后允许有任意数量的空格。你可能需要调整一下。
您的示例将不匹配,因为它在第一个标记中包含空格(没有逗号)。如果你想让它通过,你应该将空格添加到有效字符标记列表中。

nbewdwxp

nbewdwxp5#

我会使用以下代码:

/^(?:([A-Za-z0-9\s]{3,6})\s*(?:,\s*|$))*/

这将把每个文本区域的内容放入捕获组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})(?:,|$))*/

相关问题