Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正确验证用户输入的名称_Regex - Fatal编程技术网

Regex 正确验证用户输入的名称

Regex 正确验证用户输入的名称,regex,Regex,我正在尝试验证用户输入的名称。我需要确保输入的名称“字面上”有效。在我有限的知识范围内,我尝试了许多正则表达式,但没有一个能完全工作。例如/^[^.'-]+[a-zA-Z]+|[.-]{1}$/ 因为我正在开发的PHP网站完全是英文的,所以只允许使用英文名称。 适用于筛选名称的规则有: 名称可以包含以下任何字符:[A-zA-Z.'-] 名称只能以字母或撇号开头 [.-]中的任何字符在一段时间内不得出现一次以上,即“否”--“或“-” 空格不应紧跟在“或”之后,也不应紧跟在“或”之前。或- 任何人

我正在尝试验证用户输入的名称。我需要确保输入的名称“字面上”有效。在我有限的知识范围内,我尝试了许多正则表达式,但没有一个能完全工作。例如/^[^.'-]+[a-zA-Z]+|[.-]{1}$/

因为我正在开发的PHP网站完全是英文的,所以只允许使用英文名称。 适用于筛选名称的规则有:

名称可以包含以下任何字符:[A-zA-Z.'-] 名称只能以字母或撇号开头 [.-]中的任何字符在一段时间内不得出现一次以上,即“否”--“或“-” 空格不应紧跟在“或”之后,也不应紧跟在“或”之前。或-
任何人都可以提供适当的正则表达式来实现这些功能吗?

下面是一个解决问题的正则表达式演示:

/^|\n['a-z][-'.a-z]*$/gi

细分:

|\n负向前看,以确保未找到重复字符

['a-z]从这些字符中的一个开始


[-'.a-z]*其余部分也可以包含空格和破折号,并且不是必需的*而不是+

这应该适合您:

/^'?([a-z]+((\. )|( ')|['\- \.])?)+$/i
说明:

'? 可以选择以撇号开头 [a-z]+\.|'|['\-\.]?+之后允许至少包含1个字母字符的1-n组,后跟特殊字符的某些有效组合。这些是引号以查看空格或任何单个特殊字符。 /我匹配不区分大小写,否则只需指定[a-zA-Z]而不是[a-Z]。
我不确定John、.Doe或“”是否应被视为有效名称。用我的表达式,它们不会。

通过限制大型断言必须执行的所有回溯,您可能会获得更好的性能

像这样的

 #  (?i)^(?=[a-z'])(?:[a-z]+|([ ](?!-)(?<!'[ ])|[.'-])(?!\1))*$

 (?i)                 # Modifier, case insensitive
 ^                    # BOS
 (?= [a-z'] )         # Starts with an alpha or apos '

 (?:                  # Cluster
      [a-z]+               # 1 to many alpha's
   |                     # or
      (                    # (1 start), Capture group, one of [ .'-]
           [ ]                  # Single space
           (?! - )              # not a dash - ahead
           (?<! ' [ ] )         # nor apos space '[ ] behind
        |                     # or,
           [.'-]                # Single dot . or apos ' or dash -
      )                    # (1 end)
      (?! \1 )             # Backref capt grp 1,
                           # not adjacent duplicate of one of [ .'-]
 )*                   # Cluster end, do 0 to many times
 $                    # EOS

希伯来语、阿拉伯语、俄语,。。。名称?@CommuSoft目前,这些名称不在考虑之列。姓名应以英文输入。整个网站都是英文的。什么语言PHP、Java、JavaScript?@Marvin PHP。我使用的是preg_match大多数可用的方法都不是万无一失的,这是因为没有万无一失的方法。@KevinB:谢谢,我没有注意到这个要求。我已经为回复更新了regex.Thanx。它起作用了。我只是根据编辑后的问题修改了它:/^?!.*.-'.-'.-'.\.\.\.\。['a-z][-.'a-z]*$/除非后面跟一个空格,否则它可以工作。。此外,还必须允许使用像O'Brien这样的名称。现在它可以完美地工作。我将其与两个答案进行了比较,找到了Brian的答案,在大多数测试用例中,他保留了较少的步骤。所以,我选择了这个作为正确的答案。再说一遍