preg_match如何返回1

时间:2018-06-21 18:42:07

标签: php regex preg-match

无法创建此类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),则返回1,尽管应为0。请告诉我是什么问题?

1 个答案:

答案 0 :(得分:0)

([а-я]*[А-Я]*[A-Z]*[a-z]*ё*Ё*[0-9]*){2}模式部分匹配从ая的0个或更多字母,然后匹配0+个字符АЯ,依此类推。匹配0次或更多次(请参见*之后的)量词,该量词创建了repeated capturing group,因此,捕获总是只包含空字符串)。

您需要的是将每个组内的所有字符类“合并”为单个字符类,并将限制量词应用于该类:

'~^([а-яА-Я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。这里(?2)重复捕获组#2 ([а-яa-zё0-9])中的模式。