PHP允许字母和减号,但不允许重复减号
我希望允许在任何字符集(拉丁语、希伯来语、西里尔语但非unicode表情)中使用所有字母和减号(-),但不允许每次使用减号超过一次,也不允许在开头和结尾使用减号: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
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'
看
详细信息
-字符串的开头^
-1+个字母\p{L}+
-0+重复(?:[-]\p{L}+*
-空格或[-]
-
-1+个字母\p{L}+
-字符串的结尾(替换为$
以仅匹配字符串的结尾,而不是在最后一个LF符号之前)\z
修饰符
u
对于Unicode字符串来说是必需的。使用'/^\p{L}+(?:[-]\p{L}+*$/u'
-。我认为连字符规则也适用于空格,对吗?我发现你所需要的就是用你的[\p{L}-]+
替换[A-Za-z0-9-]+
。另外,添加u
以使正则表达式完全兼容Unicode,并使PCRE将输入文本视为Unicode字符。是否也允许使用不带hiphens(-)的字符串?@aelor yes itcan@WiktorStribiżew yes顶部评论解决方案有效,谢谢。我专注于建议的重复解决方案,但忽略了这一点。