2017-07-18 30 views
3

我想验证电话号码。唯一有效的电话号码是这样开始的: +36 20 | +36 30 | +36 31 | +36 70如何检查第五个和第六个字符是特定的两位数字?

我的代码看起来像这样,但现在你可以输入+ 36 21或+36 71,我想避免。我如何检查两位数字?像70或30

$phone = '+36 70 123 4567'; 

if (preg_match('|^\+36 [237][01] [1-9][0-9]{2} [0-9]{2}[0-9]{2}$|', $phone)) { 
    echo 'phone number is good'; 
} 
+0

使用交替,'(?:[237] 0 | 31)'代替'[237] [01]' –

回答

3

如果你想要一些非常具体的数字:

/^\+36(20|30|31).../ 

使用一套符号([237][01])如你观察到的将打开太多的其他的可能性。

+0

谢谢你,简单的作品精细! –

1

您可以使用非捕获组指定你需要允许值:

^\+36 (?:[237]0|31) [1-9][0-9]{2} [0-9]{4}$ 

regex demo

[237][01](两个连续字符类)匹配237后跟01,而(?:[237]0|31)2,3,7然后031字符序列。

整个模式匹配:

  • ^ - +36和空间
  • (?:[237]0|31) - - 见上文
  • 描述 - 空间
  • [1-9] - 字符stirng
  • +36的开始级别匹配的单个数字从19(不包括0
  • [0-9]{2} - 任何2个ASCII数字(从09
  • - 空间
  • [0-9]{4} - 4位数字
  • $ - 字符串的结尾。

注意,而不是字面的空间,你可以使用\s任何空白匹配,并且匹配1或0次出现(如果空白是可选的),您可以添加?(或*匹配0+事件)之后\s - \s?/\s*

+0

哇!谢谢!我已经使用了一种不同的解决方案,但是您的详细描述有助于了解正在发生的事情:) –

+0

@CsordásGergő好了,upvoting足以表示谢谢:)如果您发现另一个最适合您的答案,那就行了。 –

1
$re = '/\+36\s(20|30|31|70)\s.*/'; 
$str = '+36 20 4145654'; 

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0); 

var_dump($matches); 

这里我用\s来匹配所有的空白字符。当然,你也可以使用空格字符只能是这样的:

$re = '/\+36 (20|30|31|70) .*/'; 
相关问题