Php 基于第一个字符的条件正则表达式长度

Php 基于第一个字符的条件正则表达式长度,php,regex,Php,Regex,有一个带有数字的字符串,我需要用PHP preg_match进行验证。 如果它以10或20或30开头,我需要在初始2之后再加7个数字,但在任何其他情况下,我只需要8个数字,而不关心前导字符是什么。 第一部分是简单的 /^(1 | 2 | 3)0\d{7}$ 但是我怎样才能添加其他部分呢?我需要一个简单的 ^\d{8}$ 我需要匹配以下示例: 101234567 201234567 12345678 33445566您可以使用 ^(?:[1-3]0\d{7}|(?![1-3]0)\d{8})$

有一个带有数字的字符串,我需要用PHP preg_match进行验证。 如果它以10或20或30开头,我需要在初始2之后再加7个数字,但在任何其他情况下,我只需要8个数字,而不关心前导字符是什么。 第一部分是简单的
/^(1 | 2 | 3)0\d{7}$

但是我怎样才能添加其他部分呢?我需要一个简单的

^\d{8}$

我需要匹配以下示例:

101234567

201234567

12345678

33445566

您可以使用

^(?:[1-3]0\d{7}|(?![1-3]0)\d{8})$

详细信息

  • ^
    -字符串的开头
  • (?:
    -启动非捕获组:
    • [1-3]0\d{7}
      -
      1
      2
      3
      ,然后是
      0
      和任意7位数字
    • |
      -或
    • (?![1-3]0)\d{8}
      -不允许在字符串开头立即出现
      10
      20
      30
      ,然后匹配任意8位数字
  • -组结束
  • $
    -字符串的结尾

这里有一个替代方法,使用
(?(?=regex)然后| else)
aka:

它的字面意思是:如果
[1-3]0
在开头正确,则匹配
[1-3]0\d{7}
,否则匹配
\d{8}


演示:(无耻地从Wiktor的答案中摘取例子)

^([1-3]0\d{7}\d{8})$
尝试过,但它与10123456匹配,从10开始,只有6个数字,然后
^([1-3]0\d{7}(?![1-3]0)\d{8})$
太好了,这就是我需要的,谢谢你,伙计
^(?(?=[1-3]0)[1-3]0\d{7}|\d{8})$