【问题标题】:PHP regular expression for given condition [duplicate]给定条件的PHP正则表达式[重复]
【发布时间】:2012-10-05 13:14:39
【问题描述】:

可能重复:
php regex , extract phone number from text/html

我有以下要求。有一个电话号码字段。

  • 它的长度应该在8到10之间
  • 它只能包含 _ 和空格
  • 第一个和最后一个元素应该是数字
  • _ 和空格应在 2 位数字之间

我可以用php写一个正则表达式来验证上面的东西吗?

有效条目示例:231_901 347 无效条目示例:_123 567, 345__123

如果可能的话,请你写下 preg_match 表达式。

这是我尝试过的代码:

$subject = "_012_345 69";
$pattern = '/[\d]{1}.[\d\s_]{5,10}.[\d]{1}$/';
$matches = preg_match($pattern, $subject);
echo($matches);

它应该返回 0 但它返回 1。

【问题讨论】:

标签: php regex


【解决方案1】:
^(?=.{8,10}$)\d+(?:[ _]\d+)*$

说明:

^              # Start of string
 (?=.{8,10}$)  # Assert length 8-10
 \d+           # One or more digits
 (?:           # followed by
  [ _]         #  one space or underscore
  \d+          #  one or more digits
 )*            # zero or more times.           
$              # End of string

【讨论】:

  • @Gabber:你可能是对的;我误解了他最后的要求。
  • @TimPietzcker 不太确定了...12 23 12 12 12 是 10 位数字,但它的长度是 14 => 不是很好的匹配。我认为 OP 意味着他需要 8-10 个 digits,而不是字符,否则这将导致可能错误的位数从 1 2 2 3 1 (5) 到 1234567890 (10)
【解决方案2】:

使用正则表达式

^(?=.{8,10}$)(?=\d)(?=.*\d$)(?:\d|(?<=\d)[\s_](?=\d))+$

说明>>

^

如果是行/字符串则开始

(?=.{8,10}$)

字符串大小为 8-10 个字符

(?=\d)

第一个字符是数字

(?=.*\d$)

最后一个字符是数字

(?:\d|(?<=\d)[\s_](?=\d))+

允许的字符是 (a) 数字或 (b) 数字之间的空格或下划线

$

行尾/字符串

【讨论】:

    【解决方案3】:

    据我了解,这符合您的所有要求:

    ^(?:\d[ _]*){7,9}\d$
    

    至于你得到的那些误报,你刚刚离开了开始锚点 (^)。但即使添加了锚点,它也会匹配

    1_________2
    

    01234567890123
    

    我假设这些是无效的,因为您的意思是必须有 8 到 10 个数字,而不是总长度应该是 8 到 10 个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 1970-01-01
      相关资源
      最近更新 更多