单个字符匹配可以使用字符类完成,类似于您尝试过的:
[a-zA-Z0-9\-&'./]
然后,您可以通过在其后添加来指定任何大于或等于这些字符之一的数字+
。但是由于您要验证 is 不应超过 255 个字符,您也可以使用显式量词来执行此操作:{0,255}
允许从 0 到 255 的任何长度。请注意,连字符被转义,因为它在 a 中具有特殊含义字符类。您可以通过使用i
修饰符使模式不区分大小写来简化此操作。
匹配单个空格的要求有点复杂,有几种方法可以做到这一点,但既然你也说你想将它们标准化为一个空格,我建议你先这样做,这样你就可以添加为简单起见,为您的角色类留出空间。这可以通过另一个正则表达式轻松完成:
/ +/
这匹配每个包含 1 个或多个空格字符的块,因此您只需用一个空格替换所有匹配项。
现在您知道字符串只包含单个空格,您可以简单地断言整个字符串只包含列表中的字符,方法是使用主题断言^
和开始和结束。$
所以把它们放在一起,你会得到这样的东西:
// Replace all space blocks to a single space
$normalizedSpace = preg_replace('# +#', ' ', $input);
// Validate the input contains only the chars you want
if (!preg_match('#^[a-z0-9\-&\'./ ]{0,255}$#i', $normalizedSpace)) {
// Data invalid, handle error here
} else {
// If you get here the data is valid
$validData = trim($normalizedSpace);
}
我怀疑您也会想要trim()
数据,尽管情况可能并非如此。