PHP允许字母和减号,但不允许重复减号

PHP允许字母和减号,但不允许重复减号,php,regex,Php,Regex,我希望允许在任何字符集(拉丁语、希伯来语、西里尔语但非unicode表情)中使用所有字母和减号(-),但不允许每次使用减号超过一次,也不允许在开头和结尾使用减号: YaMo -> OK Ya-Mo -> OK Ya-Mo-Ga -> OK Ya--Mo -> FALSE Ya---Mo -> FALSE -Ya -> FALSE -Ya-Mo- -> FALSE Ya- -> FALSE Yo-Mo- Mo -> FALSE Yo-Mo -G

我希望允许在任何字符集(拉丁语、希伯来语、西里尔语但非unicode表情)中使用所有字母和减号(-),但不允许每次使用减号超过一次,也不允许在开头和结尾使用减号:

YaMo -> OK
Ya-Mo -> OK
Ya-Mo-Ga -> OK
Ya--Mo -> FALSE
Ya---Mo -> FALSE
-Ya -> FALSE
-Ya-Mo- -> FALSE
Ya- -> FALSE
Yo-Mo- Mo -> FALSE
Yo-Mo -Go -> FALSE
到目前为止,我已经:

preg_match('/^[\p{L} -]+$/', $post['firstname'])
它不考虑多次发生,也不考虑是否处于开始或结束状态。 是否有任何正则表达式方法可以做到这一点

作为解决方法,我现在检查substr的第一个和最后一个字母!='-'并与strpos一起检查'--'

拟议的类似副本是错误的,因为它不能正常工作,它允许: Yo Mo-Mo

试试这个:

^\w+(-\w+)*$
  • \w+匹配一个或多个单词字符(等于[a-zA-Z0-9]) 时代
  • (-w+)*确保单词字符与hiphen一起 显示零次或多次

您可以使用的正则表达式是

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

详细信息

  • ^
    -字符串的开头
  • \p{L}+
    -1+个字母
  • (?:[-]\p{L}+*
    -0+重复
    • [-]
      -空格或
      -
    • \p{L}+
      -1+个字母
  • $
    -字符串的结尾(替换为
    \z
    以仅匹配字符串的结尾,而不是在最后一个LF符号之前)

修饰符
u
对于Unicode字符串来说是必需的。

使用
'/^\p{L}+(?:[-]\p{L}+*$/u'
-。我认为连字符规则也适用于空格,对吗?我发现你所需要的就是用你的
[\p{L}-]+
替换
[A-Za-z0-9-]+
。另外,添加
u
以使正则表达式完全兼容Unicode,并使PCRE将输入文本视为Unicode字符。是否也允许使用不带hiphens(-)的字符串?@aelor yes itcan@WiktorStribiżew yes顶部评论解决方案有效,谢谢。我专注于建议的重复解决方案,但忽略了这一点。