Php regex验证输入的多次出现


Php regex to validate multiple occurence of input

验证这个

输入的正则表达式是什么?

以下3行为有效

PROJ9450
PROJ9400-PROJ9401-PROJ9402 ..... PROJ{n}
PROJ9400_1-PROJ9400_2-PROJ9401_1-PROJ9402_1-PROJ9408 ... PROJ{n}_{n}

以下行为无效字符串

PROJ450
PRO1223
PROJ9400a-PROJ9401-PROJ9400-PROJ1929-1-PROJ1929
PROJ9400_1-PROJ9400_2-PROJ9401_1-PROJ9402_1-PROJs453 ... PROJ{n}_{n}

I tried this

if( preg_match('/(PROJ)[0-9]{4}(-|_)?[0-9]+)/', $input) )
{
}

我可以像下面这样分割和验证,但我想通过单个regex

来实现这一点
 foreach(explode('-',$input) as $e)
 {
        if( !preg_match('/(PROJ)[0-9]{4}(-|_)?[0-9]+)/', $e) )
        {
             return 'Invalid Input';
        }
 }

输入可以只以PROJ和4位数字作为前缀

PROJ9450

输入可以前缀为PROJ和4位数字-前缀为PROJ和像这样的4位数字,直到n

PROJ9400-PROJ9401-PROJ9402……项目{n}

输入可以以PROJ和4位数字为前缀,不带核心数字-前缀是PROJ和像这样的4位数下划线数字n

PROJ9400_1-PROJ9400_2-PROJ9401_1-PROJ9402_1……项目{n} _ {n}

您需要匹配以PROJ开始,后跟4位数字(可选后跟-_和1+数字)的块重复

。使用

/^(PROJ[0-9]{4}(?:[-_][0-9]+)?)(?:-(?1))*$/

查看regex演示

:

  • ^ -字符串
  • (PROJ[0-9]{4}(?:[-_][0-9]+)?) -组1(稍后将与(?1) 递归构造递归)捕获:
    • PROJ -一个字面值字符序列
    • [0-9]{4} - 4位
    • (?:[-_][0-9]+)? -可选的(出现1或0次)
      • [-_] -一个字符类匹配-_
      • [0-9]+ - 1位或更多位
  • (?:-(?1))* - -零次或多次出现,随后是第1组子模式,直至…
  • $ -字符串的结束(最好用'z锚匹配字符串的末尾)。