Php Regex只在整个字符串中传递某些字符

Php Regex只在整个字符串中传递某些字符,php,regex,Php,Regex,我有一个字符串(可以是任意长度,最多255个字符),需要检查每个字符并确保它只包含以下字符(可以是任意顺序): 字母(a-z不区分大小写,因此a-z也不区分大小写) 数字(0-9) 连字符(-) 符号(&) 撇号(') 句号 斜杠(/) 只有一个空格(理想情况下,如果可以单独标记,以允许我删除任何多余的空格,那就太好了) 例如,下面的方法会成功 唐宁街10号 但以下情况不会发生 唐宁街10号 regex能做到这一点吗?将使用PHPpreg_match函数 提前感谢:)这将匹配允许的字符,最多

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

  • 字母(a-z不区分大小写,因此a-z也不区分大小写)
  • 数字(0-9)
  • 连字符(-)
  • 符号(&)
  • 撇号(')
  • 句号
  • 斜杠(/)
  • 只有一个空格(理想情况下,如果可以单独标记,以允许我删除任何多余的空格,那就太好了)
例如,下面的方法会成功

唐宁街10号

但以下情况不会发生

唐宁街10号

regex能做到这一点吗?将使用PHP
preg_match
函数


提前感谢:)

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


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

[a-zA-Z0-9\-&'./]
然后,通过在这些字符之后添加
+
,可以指定任何大于或等于其中一个字符的数字。但是,由于您希望验证is的长度不应超过255个字符,因此也可以使用显式量词执行此操作:
{0255}
允许从零到255的任何长度。请注意,连字符是转义的,因为它在字符类中具有特殊含义。通过使用
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()
数据,尽管情况可能并非如此。

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

[^a-zA-Z0-9 -'&./]
这将匹配除a-z、a-z、0-9、“-”、“&、”、“/”以外的任何字符

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

这不会处理whitspace,因为这是您在验证字符串之前应该处理的问题


到目前为止,你想出了什么模式?是的,可能:)你可以尝试一些东西,然后人们会帮你确定我的正则表达式绝对是垃圾-我已经知道了:/([a-zA-Z0-9])/但它只检查第一个字符-抱歉我的愚蠢:(任何有解释的初学者都会很有用,如果需要很长时间,则不需要整个解决方案:)
[^a-zA-Z0-9 -'&./]