2011-04-26 106 views
1

我想(在PHP)正则表达式的帮助:逗号分隔的列表

  1. 验证一个textarea的内容有效
  2. 将它们分开到令牌处理

为了被认为是有效的,它必须是仅包含数字和字母形成一个“代码”,即从任意位置中的3-6长度的字符串,和用来将它们分开的逗号。我已经打破了这样的东西是这样的:

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

我很难完成它虽然。我希望他们能够与任何一个逗号,或者空格和逗号空格,逗号空间,等等。我只希望这是一个逗号如果有下列有效令牌分开。

例如,输入字符串:

阿部123,PlE43,54drt,r2344

应分离成以下标记:

'ABE 123' 和'PlE43'and'54drt'and'r2344'

How我可以修复我的正则表达式以适应条件吗? (现在我有麻烦的逗号可选的,但如果是有我期待着另一个有效令牌,以及使用逗号和之前或之后作为一个有效的分隔空间的任意组合)

+1

这是一个**代币吗? 'abe 123' – Jon 2011-04-26 15:16:18

+0

@Jon yes这个“code”是一个标记 – Diego 2011-04-26 15:17:48

+1

所以标记应该定义为'[A-Za-z0-9] {3,6}'。注意空间。 – KarlsFriend 2011-04-26 15:25:01

回答

7

假设你想塌陷(令牌内即两个空间和令牌/旁边逗号之间的空隙应该被忽略)的所有空间,你可以用一些预处理更简单地做到这一点。

$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 

是一个有效的令牌。

+0

请注意,在您的示例中,这也将剥离“abe 123”的空间。提问者可能想保留这一点。 – 2011-04-26 15:27:46

+0

@Justin Morgan我想保留这个空间。即使@Jon在他的回答中确实提到了,是否有办法修改它以保留这个空间? – Diego 2011-04-26 15:29:50

+1

@Diego:看到更新,但也要记住,3对6的规则可能与“空格很好”规则奇怪地相互作用。 – Jon 2011-04-26 15:35:31

0

试试这个:

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

这个规则表达式可以做的工作。

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

它首先查找任何数目的令牌,随后是sperator。然后它期望一个单一的令牌。 在这种情况下,在逗号前后允许有任意数量的空格。你可能想调整。

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

0

我会使用以下方法:

/^(?:([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})(?:,|$))*/ 

测试您的示例数据:http://refiddle.com/10t

1

假设的要求:

  • 每个令牌是由字母,数字和空格,但必须CONT至少一个字母和至少一个数字。
  • 标记的总长度为3-6个字符,其中包含任何内部空格。
  • 假设3-6字符长度限制包含任何空格。 (因此:具有7个字符的“abe 123”将是无效的。)
  • 鉴于分隔令牌的逗号可以具有可选的空白(将被忽略),这意味着令牌可能永远不会开始或结束与一个空间(但可能包含嵌入空间)。

这是一个经过测试的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; 
} 

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

编辑:我原来对这个问题的解读使它比它所需要的更加复杂。这个简化版本只允许用逗号分隔标记。

相关问题