我想验证用户是否仅使用正则表达式输入了逗号分隔的单词列表,这是否有更好的方法:
$match = "#^([^0-9 A-z])(,\s|$))+$#";
这不是用于解析,因为我将使用explode,它只是用于验证用户是否正确理解应该用逗号分隔值。
答案 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);
}
答案 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。
关于你的正则表达式:由于无法匹配的括号,它将无效。还有一些事情需要考虑:
此外,验证这是否是逗号分隔列表的重点是什么?