Php正则表达式验证输入的多次出现

时间:2016-11-09 14:33:10

标签: php regex validation

验证此

输入的正则表达式是什么

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}

我试过这个

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

}

我可以拆分并且可以像下面这样进行验证,但我想通过单个正则表达式

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

输入可以只用PROJ和4位数字

作为前缀      

PROJ9450

OR

  

输入可以用PROJ和4位数字作为前缀 - 以PROJ和。为前缀   这样的4位数字最多为n

     

PROJ9400-PROJ9401-PROJ9402 ..... PROJ {n}

OR

  

输入可以用PROJ和4位数字的非核心数字作为前缀 -   以PROJ为前缀和4位数字下划线数字,如下所示   n

     

PROJ9400_1-PROJ9400_2-PROJ9401_1-PROJ9402_1 ... PROJ {n} _ {n}

1 个答案:

答案 0 :(得分:4)

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

使用

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

请参阅regex demo

<强>详情:

  • ^ - 字符串anchor
  • 的开头
  • (PROJ[0-9]{4}(?:[-_][0-9]+)?) - 第1组(稍后将使用(?1) recursion construct递归)捕获:
    • PROJ - 文字字符序列
    • [0-9]{4} - 4位数
    • (?:[-_][0-9]+)? - 可选的(1或0次出现)
  • (?:-(?1))* - 出现零次或多次-,然后是第1组子模式,直到......
  • $ - 字符串结尾(最好将其替换为匹配字符串末尾的\z锚点。)