如何 preg_match return 1

How preg_match return 1

无法创建这种类型的正则表达式 xx.xx.xxx, 其中 x - 可以是任何寄存器或数字的任何拉丁文或俄文字符。但是必须有2个符号,那么点=>2个符号=>点=>3个字符 做了以下表达式-

var_dump(preg_match('/^([а-я]*[А-Я]*[A-Z]*[a-z]*ё*Ё*[0-9]*){2}.([а-я]*[А-Я]*[A-Z]*[a-z]*ё*Ё*[0-9]*){2}.([а-я]*[А-Я]*[A-Z]*[a-z]*ё*Ё*[0-9]*){3}$/u', 'd1.df.dfd'));

表达式工作正常,但如果你在末尾删除 1 个字符,例如 d1.df.df,它 returns 1,虽然它应该是 0。请告诉我问题是什么?

([а-я]*[А-Я]*[A-Z]*[a-z]*ё*Ё*[0-9]*){2} 模式部分匹配 0 个或多个从 ая 的字母,然后是 0+ 个字符 АЯ,等等。所有可以匹配 0 次或多次(请参阅 ) 之后的 * 量词创建 repeated capturing group,因此,捕获始终仅包含空字符串)。

你需要的是 "merge" 每个组内的所有字符 class 为单个字符 class,并将限制量词应用于 class:

'~^([а-яА-ЯA-Za-zёЁ0-9]{2})\.([а-яА-ЯA-Za-zёЁ0-9]{2})\.([а-яА-ЯA-Za-zёЁ0-9]{3})$~u'

regex demo

使用不区分大小写的修饰符,它会更短一些:

'~^([а-яa-zё0-9]{2})\.([а-яa-zё0-9]{2})\.([а-яa-zё0-9]{3})$~ui'

此外,您可以使用子程序缩短模式:

'~^(([а-яa-zё0-9]){2})\.((?2){2})\.((?2){3})$~ui'

参见 another regex demo。 Herem (?2) 重复捕获组 #2 中的模式,([а-яa-zё0-9])