Php 正则表达式帮助:逗号分隔列表
我正在尝试(用php)Php 正则表达式帮助:逗号分隔列表,php,regex,Php,Regex,我正在尝试(用php) 验证textarea的内容是否有效 将它们分离到令牌中进行处理 为了被认为是有效的,它需要是一个字符串,只包含构成“代码”的数字和字母,长度在3-6之间,以及用于分隔它们的逗号。我把它分解成这样的东西: [A-Za-z0-9]{3,6}, 但是我完成它有困难。我希望它们能够用逗号分隔,或者用空格和逗号空格、逗号空格等分隔。我只希望在有以下有效标记的情况下有一个逗号 例如,输入字符串: abe 123,PlE43,54drt,r2344 应分为以下标记: “abe 123
[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”将无效。)
- 考虑到分隔标记的逗号可能有可选的空格(可忽略),这意味着标记可能永远不会以空格开头或结尾(但可能包含嵌入的空格)
//如果$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]#最后一个字符是数字或