preg_match没有两个或更多个hypen和撇号字符的序列

时间:2017-03-17 19:37:33

标签: php regex preg-match

我需要进行名称验证。名称只包含字母(a-z和A-Z),连字符,撇号和空格;不包含两个或多个字符连字符和撇号的序列;并以一封信开头。如果满足这些约束,那么我们称该名称有效。 到目前为止我已经完成了

 if(preg_match("/[^a-zA-Z'-]+/",$testname)) ... 

但我不知道如何禁止两个或多个字符连字符和撇号,并使其仅以字母开头。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

这个符合您的需求:

/^(?:[a-z]+[-' ]?)+$/

<强>解释

/               : regex delimiter
  ^             : begining of string
    (?:         : start non capture group
      [a-z]+    : 1 or more letter
      [-' ]?    : optionaly 1 of these characters, hyphen or apostrophe or space
    )+          : end group, 1 or more times
  $             : end of string
/i              : regex delimiter + modifier case insensitive

如果您希望名称以字母结尾:

/^(?:[a-z]+[-' ]?)+[a-z]$/i

如果您想匹配任何语言的名称:

/^(?:\p{L}+[-' ]?)+\p{L}$/

其中\p{L}代表任何语言的任何字母

好的我建议您阅读:https://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/