使用正则表达式验证逗号分隔列表

时间:2011-07-26 09:35:16

标签: php regex

我想验证用户是否仅使用正则表达式输入了逗号分隔的单词列表,这是否有更好的方法:

 $match = "#^([^0-9 A-z])(,\s|$))+$#";

这不是用于解析,因为我将使用explode,它只是用于验证用户是否正确理解应该用逗号分隔值。

4 个答案:

答案 0 :(得分:5)

我不知道,这些单独的值应该是什么样的,但这可能会对您有所帮助

$value = '[0-9 A-Z]+';
$match = "~^$value(,$value)*$~i";

如果您知道,您的价值应该是什么样的,您可以更改$value


更新

从问题

中摘取此评论
  

我试图禁止0-9但允许a-Z,因为,正如我所说,它应该只是一个单词列表,没有空格,只是一个单词列表。

只需更改$value

即可
$value = '[A-Z]+';

请注意,我在i中使用$match - 修饰符,它也包含所有小写字母。


然而,“真正的”csv比这更多一些,例如你可以在每个值周围加上引号。我建议您解析该行,然后测试每个值

$values = str_getcsv($line);
$valid = true;
foreach ($values as $value) {
  $valid = $valid && isValid($value);
}

str_getcsv()

答案 1 :(得分:2)

您的$match会出错。 此

$str = 'sdfbdf,wefwef,323r,dfvdfv';
$match = "/[\S\,]+\S/";
preg_match($match,$str,$m);

可以使用,但为什么不使用explode

答案 2 :(得分:1)

我认为这就是你要找的东西:

'#\G(?:[A-Za-z]+(?:\s*,\s*|$))+$#'

\G将匹配锚定到字符串的开头或上一个匹配结束的位置。这可以确保正则表达式在尝试匹配每个单词时不会跳过任何无效字符。例如,给定此字符串:

'foo,&&bar'

它将报告失败,因为它无法在逗号后立即开始第二场比赛。

另外,请注意字符类:[A-Za-z]。您在正则表达式中使用了[A-z],在评论中使用了[a-Z],这两个都无效(无论如何都是这样)。它们可能仅仅是拼写错误,但仍然要注意它们。那些拼写错误最终可能导致细微和/或严重的错误。

编辑:\G不受普遍支持,所以check在使用任何其他正则表达式之前都是如此。

答案 3 :(得分:0)

我建议,如果要测试正则表达式,请使用kiki

关于你的正则表达式:由于无法匹配的括号,它将无效。还有一些事情需要考虑:

  • 您目前不允许使用数字,空格和字母A-z。我认为[0-9a-zA-Z]就是你想到的,虽然它仍然过滤掉像ö这样的字母。
  • 您目前正在每个逗号后强制使用空格
  • 作为结束锚的美元符号将无效,除非它是正则表达式的最后一个字符(不包括#)

此外,验证这是否是逗号分隔列表的重点是什么?