1

我有一个字符串(可以是任意长度,最多 255 个字符),它需要检查每个字符并确保它只包含以下字符(可以是任何顺序):

  • 字母(az 不区分大小写,AZ 也不区分大小写)
  • 数字 (0-9)
  • 连字符 (-)
  • 和号 (&)
  • 撇号 (')
  • 句号 (.)
  • 斜线 (/)
  • 仅单个空格(理想情况下,如果可以单独标记它以允许我删除任何其他不需要的空格,那就太好了)

因此,例如,以下将成功

唐宁街 10 号

但以下不会

10,唐宁街

正则表达式能够做到这一点吗?将使用 PHPpreg_match函数。

提前致谢 :)

4

3 回答 3

2

单个字符匹配可以使用字符类完成,类似于您尝试过的:

[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()数据,尽管情况可能并非如此。

于 2013-04-02T11:44:40.493 回答
0

这将匹配允许的字符,最多允许 255 个字符(或空字符串)。

/^[a-z0-9'.\/& -]{0,255}$/iD
于 2013-04-02T11:43:32.173 回答
0

您可以否定正则表达式范围:

[^a-zA-Z0-9 -'&./]

这将匹配除 az、AZ、0-9、' '、'-'、''&、'.'、'/' 以外的任何字符。

如果您得到匹配项,则字符串中存在错误。

这确实 npot 处理 whitspace,因为这是在验证字符串之前应该处理的问题。

http://www.webdeveloper.com/forum/showthread.php?230179-How-do-I-reduce-multiple-spaces-into-a-single-space-using-preg_replace

于 2013-04-02T11:45:52.183 回答